缓存系统(mangodb,redis,memcache)
常见的缓存系统:
mangodb(持久化)、redis(半持久化,缓存在内存中周期性向硬盘中写入)、memcache(内存级别,非持久化)
参考地址:https://www.cnblogs.com/wupeiqi/articles/5132791.html
- redis简介
- redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。支持多种语言,有相对应的客户端。Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
- 实用场景
- 缓存热点数据,在页面数据不经常更新的情况下,使用缓存能提升用户的体验。
- 大并发应用中,使用redis作一层数据的缓冲,降低数据库的访问压力。
- redis安装与配置
- windows系统安装
- linux系统安装
- redis常用基本操作
- cmd命令窗口常用指令
- 启动服务端, redis-server
- 启动客户端,redis-cli,输入ping,输出pong,成功连接
- python连接redis,基本使用
- 安装python的redis模块
- python连接redis的方式,
- 方式一,直接连
- 方式二,连接池连接
-
View Code1 import redis 2 3 # 建立连接的方式一,直接连 4 r = redis.Redis(host='127.0.0.1',port=6379) 5 r.set('myKey','model1') 6 info = r.get('myKey') 7 print(info) 8 9 # # 建立连接方式二,通过连接池进行连接 10 11 pool = redis.ConnectionPool(host='127.0.0.1',port=6379) 12 r = redis.Redis(connection_pool=pool) 13 r.set('myKey2','model2') 14 info = r.get('myKey2') 15 print(info)
- set,设置键值
- get,获取键值
- keys,获取键,
- del, 删除对应的键值对
- exists,判断是否存在
- expire,为某个键值设置过期时间
- rename,重命名
- randomkey,随机获取键值
- type,查看值的数据类型
- scan,查看键
- scan_iter,将键转化成生成器对象
- match进行筛选匹配
- redis支持的数据类型的常用操作命令
- String是redis中最常见的存储数据类型,以二进制存储的最大容量512M,常用操作命令
- help 方法,查看语法与功能解释
- keys * ,查看所有key
- set(name,value,ex=None,px=None,nx=False,xx=False) ex设置过期时间,px毫秒级过期时间,nx为True时,只有name不存在当前的set才执行,xx为True时,只有name存在才执行当前set
- setnx(name,value) 只有name不存在时,才执行设置,实现效果为添加
- setex
- psetex
- mset(*args,**kwargs) ,批量设置键值
- getset ,设置新值并返回原有的值
- getrange,根据指定的起止位置,获取值的子序列
- setrange,根据指定的位置起,覆盖修改后面的内容
- setbit ,进行二进制位的切片
- 应用场景,网站后台进行在线用户状态
- strlen,返回值的长度
- incr,decr,自增自减,可以指定自增自减的值,不指定情况下,默认是自增自减 1
- append,追加,拼接
- Hash操作,形式上类似于python中的字典,key-->{键k1:v1,k2:v2……}
- hset(name,key,value)
- hget
- hgetall,获取所有的键值内容
- hkeys
- hvals
- hmset ,批量设置内容
- hmget ,取多个值
- hlen,键值对个数长度
- hexist
- hdel,删除指定的name
- hincrby,对指定的name对应的hash键值对中的指定key的值,进行自增
- hscan,查看、筛选,
- hscan_iter,hash的键值对数量很多时,获取一个生成器,通过循环遍历,可以获取具体的内容
- 可以使用match指定正则匹配的内容
- List操作,链表数据类型
- lpush,从左边放入,实现效果先进后出
- lrange,根据给定的范围,获取内容
- rpush,从右边放入,追加效果,先进先出
- rrange
- lpushx,只有列表存在时才添加数据,不存在时,不操作
- linsert,指定的位置,插入内容where指定之前插还是之后
- llen,对应的链表有多少个元素
- lset,重新赋值
- lrem,删除对应的键值
- ltrim,执行截断,部分删除
- lpop,rpop
- lindex,根据索引取值
- Set操作,集合自动去重
- sadd,添加,每次添加一个值
- smembers,获取所有的值
- sismember,判断是否在指定的集合中
- sinter,获取交集
- sunion,获取并集
- sdiff,获取差集
- sscan_iter,将指定的键值,转化成生成器
- Sort Set操作,有序集合,在普通集合的基础上,进行排序,元素的排序需要根据另外一个值进行比较,所以,对于有序集合,每一个元素有两个值,即值和分数(权重),分数专门用来进行排序。
- zadd,为有序集合添加元素
- zcard,进行计数
- zcount,根据指定的分数,获取之间的计数值,就是查看在指定的分数之内有多少的值
- zincrby,级别自增
- zrange,根据给定的分数范围,获取集合的元素
- zscore,查看指定值的分数
- zrank,获取指定值的具体排行级别,类似于索引
- zrem,删除指定的内容
- zremrangebyrank,根据给定的排名范围,进行删除
- 集合运算,aggregate指定分数的计算规则,默认的是sum,即分数直接相加,也可以指定为min,max
- zinterstore,获取交集
- zunionstore,获取并集
- String是redis中最常见的存储数据类型,以二进制存储的最大容量512M,常用操作命令
- 其他操作
- 管道,默认在执行每次请求都会,创建和断开一次连接操作,如果要在一次请求中,指定多个命令,则可以使用pipline实现一次请求执行多个命令,并且这些命令是原子性的,要么全都成功,则执行成功,要么执行失败
-
python操作redis事务管道示例import redis pool = redis.ConnectionPool(host='***',port=6379) r=redis.Redis(connection_pool=pool) pip3=r.pipeline(transaction=True) pipe.set('name','hello world') pipe.set('role','gogogo') ………… pip.execute()
-
- 发布订阅,常用的应用场景,博客订阅、聊天室、读写分离等
- 生产者消费者模型
-
订阅者import redis # 链接redis r = redis.Redis(host='***') # 创建监听句柄 pub =r.pubsub() # 开始监听 pub.subscribe('指定的监听内容') #例如,fm93.1,发布者自定义的 # 开始接收内容 pub.parse_response() while True: msg = pub.parse_response() print(msg)
发布者import redis r = redis.Redis(host='****') r.publish('自定义的频道',发布的内容) # 这里的发布频道name是自定义的,但是订阅者必须监听对应的频道,才能收到信息
-
- 生产者消费者模型
- cmd命令窗口常用指令
- python对memache的支持比较好。
