redis介绍:

redis是一种noSQL数据库,它的数据是保存在内存中,同时,redis可以定时把内存中的数据同步到磁盘,即可以将数据持久化,并且它比memcached支持更多的数据结构,string, list, set, sorted_set, hash

redis应用场景:

1. 登陆会话存储,存储在redis中,与memcached相比,数据不会丢失

2. 计数器/排行榜: 这种数据访问的频率很高,且不停的在刷新。

3. 作为消息队列:比如celery就是使用redis作为中间人

4. 当前在线人数,会显示当前系统有多少人在线

5. 一些常用的数据,可以使用redis缓存,而不用每次登陆都要请求数据库

6. 可以将前200篇文章或者评论缓存,一般用户浏览网站,只会浏览前面一部分文章或者评论,所以可以将前面一部分的数据缓存起来,当用户访问超过时,再去请求数据库,并且当文章超过200且有更新时,redis章的数据也跟着更新。

8. 发布和订阅功能,可以用来做聊天软件

redis和memcached的比较:

  memcached redis
类型 纯内存数据库 内存+磁盘同步
数据类型 在定义val时固定数据类型 不需要
虚拟内存 不支持 支持
过期策略 支持 支持
存储数据安全 不支持 可以将数据同步到dump.db中
灾难恢复 不支持 可以将磁盘中的数据恢复到内存中
分布式 支持 主从同步
订阅与发布 不支持 支持

虚拟内存:操作系统在内存不够用的时候,将硬盘虚拟化为内存。

Redis安装与连接:
redis官方只支持linux系统:

可以尝试安装window下的redis服务,然后我们的主要目标是通过python来操作redis

windows下redis的下载地址:

Github 下载地址:https://github.com/microsoftarchive/redis/releases

这里选择下载msi安装文件,点击安装文件:

点击安装包,开始安装:

点击next即可:

设置redis的安装目录,以及勾选将redis添加到环境变量,此时会将Redis 设置成 windows 下的服务,否则每次都要在该目录下启动命令 redis-server redis.windows.conf,但是只要一关闭 cmd 窗口,redis 就会消失,这样就比较麻烦。

然后保持redis默认端口不变:

关于最大内存设置:

1. 如果是将redis作为数据库使用,那不需要设置这个选项,应为设置了固定的大小,在内存超出这个设定的时候,数据就会丢失

2. 如果是作为缓存,那么可以按需设置redis的最大内存限制,设置了最大内存限制,redis在启动之后会将数据加载到内存中。g当数据超过最大内存限制之后,redis会将过期或者即将过期的数据清除,如果内存依然超过最大限制,则此时redis将不能写入数据,但是可以正常读取数据。

这里是最为缓存使用的,所以设置最大的内存限制为500M;安装即可

安装完成后,可以在资源管理器中看到Redis已经在运行了:

此时先停止redis服务

设置redis密码(默认是没有密码的):找到下面的两个文件,打开后分别是requirepass的值:

在cmd下,cd到redis安装的根目录:执行redis-server.exe redis.windows.conf

此时表示redis安装成功。

在资源管理器中,首先确定已经启动了Redis服务,如果没有启动,先手动启动Redis服务:

然后在命令行中执行命令:redis-cli -a 123456ff,即可连接到redis:

redis字符串以及过期时间设置:

常用方法:

1. set key val  设置

2. get key

3. del key

4. set key val EX 10   设置过期时间,默认为永不过期

5. ttl key  查看过期时间

6. expire key time     重新为key设置过期时间

7. keys *    获取redis中所有的键

Redis列表操作:

1. lpush key value    在列表左边添加元素

2. rpush key value     在列表右边添加元素

3. lrange key start stop    查找列表中的元素,start起始位置, stop结束位置     0第一个元素的索引      -1最后一个元素的索引

4. lpop  key   移除并返回列表key的头元素

5. rpop  key   移除并返回列表key的尾元素

6. lindex key index   查看下表为index的元素

7. llen key 返回列表的长度

8. lrem key count val    删除列表中的指定元素

count >0 从表头开始向表尾搜索,移除值为value的元素,移除的数量为count个

count <0 从表尾开始向表头搜索,移除值为value的元素,移除的数量为-count个

count=0  表示删除所有值为value的元素

Redis集合操作:

集合:

1. 数据不能重复

2. 列表中的元素是有序的,而列表中的元素是无序的。

集合的操作:

1. sadd key val1 val2 val3      给集合中添加元素

2. srem key val1 val2             移除集合中的元素

3. scard key                           查看集合中的元素个数

4. sinter key1 key2                 查看两个集合的交集

5. sunion key1 key2               查看两个集合的并集

6. sdiff  key1, key2                查看两个集合的差集

Redis Hash操作:(在python中为字典)

哈希: 字典中的字典:person
{

"username": "tom",

"person": {

"name": "xxx",

"age":  22

}

}

1. hset key field value        将hash表key中的域field的值设置为value

hset person name xxx

hmset person name xxx age 22 sahool high-school        一次添加多个键值对

2. hget key  field                获取哈希中field域的值

hget person name

3. hdel key field                删除哈希表中field域

hdel person name

4. hgetall key                    获取hash中的所有键值对

5. hkeys key                      获取哈希中所有的键

6. hvals key                       获取哈希中所有的值

7. hexists key field            判断哈希中是否存在某个键

hexists person name

8. hlen key   获取哈希中所有的键值对

hlen person

Redis事务操作:

redis事务一次可以执行多个命令,事务具有以下特征:

隔离操作: 事务中的所有命令都会序列化,按顺序的执行,不被其他命令打扰

原子操作:事务中的命令要么全部被执行,要么全部都不执行

开启一个事务:

multi命令开启一个事务, 然后编写一些列的命令

执行事务:

exec命令用于执行事务

取消事务:

discard命令用于取消事务

1. 监视一个或者多个key:   watch key    如果在事务执行之前,这些key被其他的命令所改动,那么事务将被打断

2. 取消所有key的监视     unwatch

Redis发布/订阅操作: 

Redis发布,相当于发送消息,而订阅,相当于监听,监听是否有消息发送过来

发布,首先要指定将消息发布到哪一个频道上去,订阅,也要指定是在监听哪一个频道

subscribe channel   开始监听

publish channen message   发布信息

可以订阅多个频道

实际的应用场景:发送邮件,python代码操作redis发送邮件

RDB和AOF两种数据持久化机制:

在redis.conifg文件中:  数据同步方式

save 900 1                      在900秒内发生1次数据更新,则把数据同步到RDB文件中

save 300 10                    在300秒内发生10次数据更新,则把数据同步到RDB文件中

save 60 10000                在60秒内发生10000次数据更新,则把数据同步到RDB文件中

redis默认的是RDB数据持久化机制

关闭RDB,只需要将config文件中的所有的save注释掉

  RDB AOF
开启关闭 默认开启;关闭:将配置文件中所有的save都注释了 在配置文件中,appendonly yes就开启了AOF,no为关闭
同步机制 可以指定某个时间内发生多少次数据更新则进行同步save 300 10 每秒同步或者每次发生数据更新后同步
存储内容 存储的是redis里面的具体值 存储的是redis中执行写操作的命令
存储文件的路径 根据dir以及filename来指定具体的存储路径和文件名 根据dir以及appendfiename来指定具体的路径和文件名
优点

1.存储数据到文件中会进行压缩,文件体积比AOF小。

2. 存储的是redis中数据的具体值,并且经过压缩,所以在恢复的时候比AOF块,非常适用于备份

1. AOF的策略是每秒钟或者每次发生写操作的时候,都会进行数据同步,因此即使服务器发生故障,最多只丢失1秒的数据。

2. AOF存储的是Redis命令,并且是直接追加到aof文件后面,因此每次备份的时候只需添加新的命令进去就可以了。

3. 如果AOF文件比较大了,redis会进行重写,只保留最小的命令集合

缺点

1. RDB在多少时间内发生多少次写操作的时候,就会发出同步机制,因为采用压缩机制,RDB在同步的时候都重新保存整个redis中的数据,因此一般会设置最少5分钟才保存一次数据,在这种情况下,一旦服务器故障,会造成5分钟的数据丢失

2. 载数据保存进RDB的时候,Redis会fork出一个子进程来进行数据同步,在数据量比较大的时候,可能会非常耗时

1. AOF文件没有压缩,所以体积会比RDB文件大。

2. AOF是在每秒或者每次写操作的时候都进行备份,因此如果并发量比较大,效率可能有点慢。

3. AOF文件因为存储的是命令,因此在灾难恢复的时候,会重新运行AOF中的命令,速度不及RDB

AOF中数据同步的策略:

appendsync always   只要发生一次数据更新, 就进行同步

appendsync everysec    每秒钟进行一次同步

appendsync no         使用操作系统的同步机制,通常是30s同步一次数据

其他机器连接本机Redis:

如果想让其他机器连接本机的redis,那么应该在redis.config配置文件中,指定bind 本机IP。这样别的机器就能连接成功

python操作Redis:

安装redis:pip install redis-i https://pypi.douban.com/simple/

相当于一个驱动,可以通过这个python包来操作redis

# -*- coding: utf-8 -*-from redis import Redis# 初始化redis实例对象
cache = Redis(host="127.0.0.1", port="6379", password="123456ff")# 字符串操作
cache.set(name="username", value="tom", ex=120)    # ex是设定过期时间
username = cache.get(name="username")
print(username)cache.delete("username")
username = cache.get("username")
print(username)# 列表操作
cache.rpush("language", "java")
cache.rpush("language", "python")
cache.rpush("language", "C++")
cache.rpush("language", "php")
cache.expire(name="language", time=120)
print(cache.lrange("language", start=0, end=-1))# 集合操作
cache.sadd("teammate", "zhang")
cache.sadd("teammate", "tom")
cache.sadd("teammate", "kong")
cache.expire(name="teammate", time=120)
print(cache.smembers(name="teammate"))# hash操作
cache.hset(name="person", key="name", value="took")
cache.hset(name="person", key="age", value="moon")
cache.hset(name="person", key="address", value="street No.1")
cache.expire(name="person", time=120)
print(cache.hgetall(name="person"))# 事务操作
pipeline = cache.pipeline()
pipeline.set(name="name", value="kitty", ex=100)
pipeline.rpush("candidate", ["coon", "mood", "cooker"])
pipeline.expire(name="candidate", time=120)
pipeline.execute()

发布与订阅:

异步发送邮件,在订阅之后,只需通过频道发送一个消息,订阅方会在收到消息后,自动发送邮件

发送消息:

# -*- coding: utf-8 -*-from redis import Redis# 初始化redis实例对象
cache = Redis(host="127.0.0.1", port="6379", password="123456ff")for x in range(3):# 发布消息cache.publish(channel="email", message="2333scas@163.com")   # 发布的频道,及消息

接收消息:

# -*- coding: utf-8 -*-from redis import Redis# 初始化redis实例对象
cache = Redis(host="127.0.0.1", port="6379", password="123456ff")# 发布与订阅   异步发送邮件的功能
ps = cache.pubsub()
ps.subscribe("email")     # 订阅
while True:# ps.listen()      # 开始监听for item in ps.listen():      # 监听到消息# print(item)if item.get("type") == "message":data = item.get("data")print(data)# 可以进行发送邮件操作

监听到的消息,item的数据如下所示:

如果item中的字段为message,则表示收到发布信息,data字段中为收到的信息。channel为发布的频道。

--------------------------------------------------------------------------------------------------------

Web后端学习笔记 Flask (14)redis相关推荐

  1. Web后端学习笔记Flask(2)模板

    模板渲染: 在flask中,视图函数可以直接通过render_template进行模板渲染.在flask中,模板文件是存放在template文件夹中:在调用模板文件的时候,模板文件的路径从templa ...

  2. Web后端学习笔记 Flask(1)基础知识

    基础的准备 1. 使用的python版本 python3.6 2. pycharm编辑器 3. 安装python虚拟环境: python中的虚拟环境: python中的虚拟环境相当于一个抽屉,在这个抽 ...

  3. Web后端学习笔记 Flask (5) 数据库

    MySql数据库安装:省略 SQLAlchemy介绍和基本使用: 数据库是开发网站的基础,,在Flask中,支持的数据库有:MySql,PostgreSql,SQLite,Redis,MongoDB来 ...

  4. Web后端学习笔记 Flask(10)CSRF攻击原理

    CSRF(Cross Site Request Forgery,跨站域请求伪造)是一种网络的攻击方式,它在2007年曾被列为互联网20大安全隐患之一. CSRF攻击的原理: 网站是通过cookie实现 ...

  5. Web后端学习笔记 Flask(9)cookie and session

    Flask_wtf除了可以做表单验证,模板渲染之外,还可以防御CSRF攻击.要了解CSRF攻击的原理,首先需要了解cookie和session的知识点. cookie:在网站中,HTTP请求是无状态的 ...

  6. Web后端学习笔记 Flask(11)Local线程隔离对象

    flask中的上下文:应用上下文和请求上下文 1. 在flask中,是通过request对象获取用户提交的数据,但是在整个程序运行中,只有一个request对象.在实际应用场景中,会有多个用户同时进行 ...

  7. Web后端学习笔记 Flask(8) WTForms 表单验证,文件上传

    Flask-WTF是简化了WTForms操作的一个第三方库.WTForms表单的两个主要功能是验证用户提交数据的合法性以及渲染模板.同时还包含一些其他的功能.例如CSRF保护,文件上传等功能,安装fl ...

  8. Web后端学习笔记 Flask(7)数据库

    高级查询: 1. group_by 根据某个字段进行分组,比如说需要根据某个字段分组,来统计每组有多少人. 2. having having是对查询结果进一步过滤,比如只想看到未成年人的数量,那么首先 ...

  9. Web后端学习笔记 Flask(4)视图函数

    Flask中的视图函数以及视图类: 添加视图函数还可以通过下面的方式add_url_rule进行: app.add_url_rule(rule,  endpoint,  view_func): rul ...

最新文章

  1. c++的:: . :-的区别
  2. PHP编程最快明白 by www.kuphp.com 案例实战zencart1.38a支付模块简化Fast and Easy Checkout配置...
  3. 创业公司如何做数据分析(四)ELK日志系统
  4. 不使用java内置函数,将String字符串转换为int类型
  5. Firefox开发者工具里查看HTML元素的Box模型
  6. SQLlite在安卓中的基本详解和简单使用
  7. C++学习之路 | PTA乙级—— 1083 是否存在相等的差 (20 分)(精简)
  8. java比较时间的先后utc时间,日期、时间与UTC
  9. Oct22 实例测试
  10. cf——Sasha and a Bit of Relax(dp,math)
  11. 数据库常用的sql语句大全--sql
  12. 谷歌浏览器无法携带cookie
  13. 使用python做一个翻译工具
  14. 智慧路灯杆系统解决方案
  15. java实现微信公众号API服务端调用封装
  16. 解决白天黑夜模式切换导致Fragment崩溃问题
  17. win10左右声道音量不一致的解决方法
  18. python中的海归制图(turtle)绘制文字
  19. 除了 P 站,还有这些站 ~~
  20. ERP项目实施| 准备工作、建议和注意事项

热门文章

  1. k8s高可用集群_搭建高可用集群(实现方式介绍)---K8S_Google工作笔记0054
  2. Mycat监控_监控平台安装zookeeper_作为配置中心注册发现用---MyCat分布式数据库集群架构工作笔记0036
  3. Netty工作笔记0081---编解码器和处理器链梳理
  4. Python工作笔记003---正则中的re.I re.M_以及m.group和m.groups的解释
  5. 正则表达式学习笔记009--大括号与选择符的认识与应用
  6. jsp页面引用相关js,css文件路径问题
  7. ibatis 如何直接执行sql语句
  8. java 数字的进制转换
  9. c++ 十进制、十六进制和BCD的相互转换
  10. linux下的C语言开发(管道通信)