Redis常用功能

5大应用场景:1.缓存技术; 2.列队; 3. 去重技术; 4. 积分板; 5.订阅与发布

Redis应用场景

  • 使用Redis做缓存
    • Redis的字符串、哈希表两种结构适合做key与value信息
  • 使用Redis做队列
    • 使用列表可以实现普通级优先级队列功能
    • 使用有序集合数据结构,可以实现优先级列队
    • 使用哈希表可以实现 延时队列
  • 使用Redis去重
    • 利用集合,实现小批量数据去重
    • 利用字符串数据结构的位操作,实现布隆过滤,大规模去重
    • 利用自带的HyperLogLog数据结构,可以实现超大规模去重和计数
  • 使用Redis实现积分板块
    • 有序集合可以实现积分版功能,自动排序排名等
  • 使用Redis实现发布订阅功能
    • 自带的订阅发布模式可以实现多对多发布订阅

连接Redis

简单连接

通常本机没有设置密码 可以简写为

1
2
3
4
5
6
7
import redis

"""decode_responses 写存的数据是字符串形式"""
r = redis.Redis(host='ip地址', port=6379, db=0, password='设置的密码', decode_responses=True) # 默认db=0

"""本地redis无密码可以简写"""
r = redis.Redis()

连接池

当并发量比较高的时候, 频繁的连接创建和释放对性能会有较高的影响;连接池的原理是, 通过预先创建多个连接, 当进行redis操作时, 直接获取已经创建的连接进行操作。

1
2
3
4
5
6
import redis

"""decode_responses 写存的数据是字符串形式"""
pool = redis.ConnectionPool(host='ip地址', port=6379, db=0, password='设置的密码', decode_responses=True) # 默认db=0

r = redis.Redis(connection_pool=pool)

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