5大应用场景:1.缓存技术; 2.列队; 3. 去重技术; 4. 积分板; 5.订阅与发布
Redis应用场景
- 使用Redis做缓存
- Redis的字符串、哈希表两种结构适合做key与value信息
- 使用Redis做队列
- 使用列表可以实现普通级和优先级队列功能
- 使用有序集合数据结构,可以实现优先级列队
- 使用哈希表可以实现 延时队列
- 使用Redis去重
- 利用集合,实现小批量数据去重
- 利用字符串数据结构的位操作,实现布隆过滤,大规模去重
- 利用自带的HyperLogLog数据结构,可以实现超大规模去重和计数
- 使用Redis实现积分板块
- 有序集合可以实现积分版功能,自动排序排名等
- 使用Redis实现发布订阅功能
- 自带的订阅发布模式可以实现多对多发布订阅
连接Redis
简单连接
通常本机没有设置密码 可以简写为
1 | import redis |
连接池
当并发量比较高的时候, 频繁的连接创建和释放对性能会有较高的影响;连接池的原理是, 通过预先创建多个连接, 当进行redis操作时, 直接获取已经创建的连接进行操作。
1 | import redis |
1. 字符串
插入字符串
简单插入1
r.set('key', 'value')
nx=True控制相同key不覆盖1
r.set('key', 'value', nx=True) # 不覆盖
获取
通过get获取到的是bytes类型,所以需要
decode转换
1 | ret = r.get('key2').decode() |
追加
- 文本追加
append(key,appebd)
往文本后面增加文本 - 数字增量
incr(key)
数字增加、参数2默认1= 增加1 - 数字减量
decr(key)
数字减小、参数2默认1= 减1
使用场景
常用于记录简单的映射关系。 例如 一万个员工信息与工号的关系 ,key=工号、value=员工名
弊端
- 数据量超过百万级,字符串储存会造成大量内存浪费, 此时推荐用redis的hash数据储存,
内存占用率只有字符串类型1/4,速度不比字符串形式差
- 当数据量上百万级时候,运行
keys *
会很卡,所以在不知道数据体量时,切勿运行keys *
命令
2. 列表
列表分左右两个方向,所以可以从两侧对列表进行操作
还有很多操作例如:
Lrem
删除指定元素lindex
获取指定下标的值ltrim
修剪列表Linsert
指定位置添加元素lpushx
如果存在添加,不存在不添加rpushx
同上blpop
有值就取出,否则阻塞等待brpop
同上brpoplpush
同上
插入数据
插入 | 描述 | 语法 |
---|---|---|
从左插入 | 原生语法 | lpush list str |
从左插入 | redis模块 | r.lpush(list, str) |
从右插入 | 原生语法 | rpush list str |
从右插入 | redis模块 | r.rpush(list, str) |
查看数据
查数据长度
查看 | 描述 | 语法 |
---|---|---|
查看长度 | 原生语法 | llen key |
查看长度 | redis模块 | r.llen(key) |
根据索引查找
索引从左边开始,可以为-1 例如 查看右边5条。
lrange key -5 -1
查找 | 描述 | 语法 |
---|---|---|
根据索引查找 | 原生语法 | lrange key 0 2 查找索引 0-2的 |
根据索引查找 | redis模块 | r.lrange(list, 0,2) |
查看列表所有 | 原生语法 | lrange key 0 -1 |
查看列表所有 | redis模块 | r.lrange(list, 0,-1) |
查看列表所有数据
在不知道数据量的时候,切勿查找所有,应当先查看其长度
查找 | 描述 | 语法 |
---|---|---|
查看列表所有 | 原生语法 | lrange key 0 -1 |
查看列表所有 | redis模块 | r.lrange(list, 0,-1) |
弹出数据
除了读取,还能弹出pop数据,弹出也分左右,注意数据弹出后会被删除
弹出 | 描述 | 语法 |
---|---|---|
从左弹出 | 原生语法 | lpush key |
从左弹出 | redis模块 | r.lpop(key) |
从右弹出 | 原生语法 | rpush key |
从右弹出 | redis模块 | r.rpop(key) |
修改数据
支持,根据索引查修改数据值
修改 | 描述 | 语法 |
---|---|---|
修改数据 | 原生语法 | lset key index new_str |
修改数据 | redis模块 | r.lset(key, index, value) |
3. 集合
集合与列表不同之处: 集合数据不能重复,且集合没有方向!
集合的应用
- 根据集合内数据不重复的特性实现去重并记录信息
- 多个集合可以做交集、差集等计算
比如: 学生课程监控,学生报名每一门课为一个集合, 这样就可以计算出,既报了学科A 又报名了学科B的学生。 或者只报名了A没报名B的学生
插入数据
1 | sadd key value1 value2 |
- key 可以是数字、字母、下划线、中文 但是不建议使用中文
- value 可以是一个或者多个,如果多个则必须用空格隔开
- 插入顺序无关
- 插入后返回插入数据量(去重之后的)
查找数据
spop取出的数据会被删除掉, 但是 smembers取全部数据不会删除
功能 | 描述 | 语法 |
---|---|---|
取元素数量 | 原生语法 | scard key |
取元素数量 | redis模块 | r.scard(key) |
取数据 | 原生语法 | spop key sount count为取多少数据 默认1条 |
取数据 | redis模块 | r.spop(key) |
取全部数据 | 原生语法 | smembers key |
取全部数据 | redis模块 | r.smembers(key) |
判断是否存在 | 原生语法 | sismembers key 存在返回1 |
判断是否存在 | redis模块 | r.sismembers(key) |
删除数据
1 | srem key value1 value2 |
集合的交集
概念:集合A 与 集合B ,A与B都有的数据集合称为交集
1 | sinter key key2 |
集合的并集
概念:集合A 与 集合B ,两个集合合并在一起并去重
1 | sunion key key2 |
集合的差集
概念:集合A 与 集合B ,只属于自己的集合,与上面两个相反
1 | sdiff key key2 |