redis教程
redis 是非关系型的kv型数据库
- 特点:
- 开源的, 使用C编写, 基于内存且支持之就花
- 支持数据类型丰富, 字符串strings, 散列hashes, 列表lists, 集合sets, 有序集合sorted sets等等
- 支持多种编程语言(C C++ python Javs PHP…)
- 单进程单线程
rediis 亮点功能
一. 字符串
-
命令操作
:- get key
- 说明: 获取key的值
- 返回值: key的值 或者 ‘nil’
- set key value nx ex
- 说明: 设置一个字符串的key
- 特殊参数:
nx -> not exist 代表key不存在时, 才储存这个值
ex -> expire 过期时间, 单位s
- strlen key
- 说明: 获取key存储值得长度
- getrange key start stop
- 说明: 获取指定范围切片的内容 [包含start stop]
- setrange key index value
- 说明: 从索引开始, 用value替换原内容, 返回最新长度
- mset key1 value1 key2 value2 key3 value3
- 说明: 批量添加key和value
- mget key1 key2 key3
- 说明: 批量获取key的值
- exists key
- 说明: 查看key是否存在
- get key
-
数值操作
- incrby key 步长 将key增加指定的步长
- decrby key 步长 将key减少指定的步长
- incr key +1 操作
- decr key -1 操作
- incrbyfloat key strp
-
应用场景
- 缓存
- 说明 : 将mysql中的数据存储到redis字符串类型中
- 并发计数 = 点赞/秒杀
- 说明: 通过redis单进程单线程的特点, 由redis负责计数, 并发问题转为串行问题
- 带有效期的验证码
- 说明: 借助过期时间, 存放验证码, 到期后,
-
删除机制
每个redis数据库中, 都会有一个特殊的容器负责储存带有过期时间的key以及它对应的过期时间, 这个容器称之为"过期字典"
针对过期字典中的key, redis结合 惰性删除和定期删除 两大机制, 有效删除过期数据
- 惰性删除
- 当调用key时, 检查是否过期, 如果过期则删除
- 定期删除
- 主动定期扫描过期字典中的数据, 检查是否过期
- 惰性删除
二. 列表
基本概念
- 元素是字符串类型
- 列表头尾增删快, 中间增删慢, 增删元素是常态
- 元素可重复
- 最多可包含2^32-1个元素
- 索引同列表
常用命令
- 增加数据
-
LPUSH key value1 value2
- 说明: 从列表头部压入元素
- 返回: list最新的长度
-
RPUSH key value1 value2
- 说明: 从列表尾部压入元素
- 返回: list最新的长度
-
RPOPLPUSH src dst
- 说明: 从列表src尾部弹出1个元素, 压入到列表dst的头部
- 返回: 被弹出的元素
-
LINSERT key after|before value newvalue
- 说明: 在列表指定元素后/前插入元素
- 返回:
- 如果命令执行成功, 返回列表元素
2, 如果没有找到pivot, 返回 -1 - 如果key不存在或为空列表, 返回0
- 如果命令执行成功, 返回列表元素
-
查看列表元素
LRANGE kwy start stop
-
获取列表长度
LLEN key
-
从列表头部弹出1个元素
LPOP key
-
从列表尾部弹出1个元素
RPOP key
-
列表头部, 阻塞弹出, 列表为空时阻塞
BLPOP key timeout
-
列表尾部, 阻塞弹出, 列表为空时阻塞
BRPOP key timeout
-
关于BLPOP 和 BRPOP 说明
- 如果弹出的列表不存在或者为空, 就会阻塞
- 超时时间设置为0, 就是永久阻塞, 知道有数据可以弹出
- 如果多个客服端阻塞再同一个列表上, 使用First In First Service原则, 先到先服务
-
-
LREM key count value
说明: 删除指定元素
count>0: 表示从头部开始向表尾部搜索, 移除与value相等的元素, 数量为count count<0: 表示从尾部开始向表头搜索, 移除与value相等的元素, 数量为count count=0: 表示移除表中所有与value相等的值
返回: 被移除元素的数量
-
LTRIM key start stop
- 说明: 保留指定范围内的元素
- 返回: ok
- 场景:
保存微博评论最后500条
LTRIM weibo:comments 0 499
-
LSET key index newvalue
- 说明: 设置list指定索引的值
-
- 增加数据
应用场景
:- 存储微博评论, 做切割, 只保留最新的xx个
- 生产者消费者模型, 做中间层, 存放生产者的任务
三. 位图操作
- 常用命令
SETBIT
命令- 说明: 设置某位置上的二进制值
- 语法: SETBIT key offset value
- 参数: offset - 偏移量 从0开始 value - 0 或者1
- 两种情况
- key不存在时: 初始化最小字节数的bit位, 默认补0
- key存在时:
- 满足长度要求, 直接修改当前bit位
- 在原有value上初始化最小字节数的bit位
GETBIT
命令- 说明: 获取某一位上的值
- 语法: GETBIT key offset
BITCOUNT
命令- 说明: 统计键所对的值中有多少个1
- 语法: BITCOUNT key start end
- 参数: start/end代表的是字节索引
- 示例:
127.0.0.1:6379> set mykey ad OK 127.0.0.1:6379> bitcount mykey (integer) 6 127.0.0.1:6379> bitcount mykey 0 0 (integer) 3
应用场景
- 假设现在我们希望记录自己网站上的用户的上线频率, 比如说, 计算用户a上线了多少天, 用户b上线了多少天, 诸如此类, 以此作为数据, 从而决定让那些用户参加重要活动 —这个模式可以使用SETBIT和BITCOUNT来实现.
- 比如说, 每当用户在某一天上线的时候, 我们就使用SETBIT, 以用户名作为key, 将那天所代表的网站的上线日
作为offset参数, 并将这个offset上的位设置为1
举个例子: 如果今天是网站上线的第100天, 而用户Peter在今天阅览过网站, 那么执行命令 SETBIT peter 100 1; 如果 明天Peter也继续阅览网站, 那么执行命令SETBIT peter 101 1, 以此类推 当要计算Peter总共以来的上线次数时, 就使用BITCOUNT命令: 执行BITCOUNT peter, 得出的结果就是peter上线的总天数
性能测试
网站运行10年, 占用的空间也只是每个用户10*365比特位(bit), 也即是每个用户456字节, 对于这种大小的数据来说, BITCOUNT的处理速度就像GET和INCR操作一样快
四. 数据类型 - 哈希-1
定义
:- 由field和关联的value组成的键值对
- field和value是字符串类型
- 一个hash中最多包含2^32-1个键值对
五. 数据类型 - 集合
-
概念
:- 无序, 去重
- 元素是字符串类型
- 最多包含2^32-1个元素
- 类似于python中所学的集合
-
常用命令
- 增加一个或者多个元素, 自动去重; 返回值为成功插入到集合的元素合数
SADD key member1 member2
- 查看集合中所有元素
SMEMBERS key
- 删除一个或者多个元素, 元素不存在自动忽略
SREM key member1 member2
- 元素是否存在
SISMEMBER key member
- 随机返回集合中指定个数的元素, 默认为1个
SRANDMEMBER key [count]
- 弹出成员
SPOP key [count]
- 返回元素的个数
SCARD key
- 把元素从源集合移动到目标集合
SMOVE source destination member
- 差集(number1 1 2 3 number2 1 2 4 结果为3)
SDIFF key1 key2
- 差集保存到另一个集合中
SDIFFSTOPRE destination key1 key2 ``
- 交集
SINTER key1 key2 SINTERSTORE destination key1 key2
- 并集
SUNION key1 key2 SUNIONSTORE destination key1 key2
- 增加一个或者多个元素, 自动去重; 返回值为成功插入到集合的元素合数
-
应用场景
- 是社交类平台, 共同好友 - 交集
- 纯随机类抽奖
- 防止元素重复
- 累/白名单
六. 数据类型 - 有序集合
基础概念
- 有序, 去重
- 元素是字符串类型
- 每个元素都关联着一个浮点数分值(score), 并按照分值从小到大的顺序排列集合中的元素(分值可以相同)
- 最多包含2^32-1元素
常用命令
-
在有序集合中添加一个成员, 返回值为 成功插入集合中的元素个数
zadd key score member
-
查看指定区间元素(升序)
zrange key start stop [withscores]
-
查看指定区间元素(降序)
zrevrange key start stop [withscores]
-
查看指定元素的分值
zscore key member
-
返回指定区间元素
zrangebyscore key min max [withscores] [limit offset count]
- 参数说明:
- min/max:最小值/最大值区间, 默认闭区间(大于等于或小于等于); (min, 可开启开区间即(大于或小于)
- offset: 跳过多少个元素
- count: 返回几个
- limit选项跟mysql一样
- 参数说明:
-
删除成员
zrem key member
-
增加或减少分数
zincrby key increment member
-
返回元素排名
zrank key member
-
返回元素逆序排序
zrevrank key member
-
删除指定区间的元素 (默认闭区间, 可做开区间)
zremrangebyscore key min max
-
返回集合中元素个数
zcard key
-
返回指定范围中元素的个数 (默认闭区间, 可做开区间)
zcount key min max
-
并集
zunionstore destination numkeys key [weights 权重值] [AGGREGATE SUM|MIN|MAX]
zunionstore salary3 2 salary salary2 weights 1 0.5 AAREGATE MAX
2代表集合数量, weights之后, 权重1给salary, 权重0.5给salary2集合, 算完权重之后执行聚合AGGREGATE
-
交集
zinterscore destination numkeys key [weights 权重值] [AGGREGATE SUM|MIN|MAX]
参数同并集
-