redis怎么学
官方学习网站:
redis.cn
1、整体了解redis
redis是一个内存数据库、kv数据库,数据结构数据库,redis中数据都是存储在redis中,可以通过key查找value,value可以有多种数据结构,有:string、list、hash、set、zset
2、redis怎么用,怎么操作redis数据结构
redis使用方式是一个请求响应交互模式,存储的是k-v对,value支持以下集中类型
- string:支持二进制安全字符串,不会被特殊字符截断,支持\0
- hash:唯一,无序
- list:不唯一,插入有序
- set:唯一,无序
- zset:有序集合,唯一
使用命令进行交互:
set key value
setnx key value 设置不存在的key value对,不存在才会成功
del key
3、redis 中的value编码规则:
- string类型:
有3种,在字符串长度小于等于20且为数字时为int,字符串长度大于44为raw,字符串长度小等于44时为embstr
raw类型是一种动态字符串,在字符串长度小于1M时,加倍扩容,大于1MB时,每次只扩1M,最多512M
- list类型:
quicklist双向链表
ziplist压缩链表
- hash:
字典dict:节点数量大于512或字符串长度大于64,
ziiplist:节点数量小于512且字符串长度小于64
- set:
intset 元素都为整数且节点数量小于512
dict:节点数量小于512或有一个以上元素不为整数
- zset:
skiplist – 数量大于68且有一个字符串长度大于64
ziplist – 节点数量小于68且字符串长度小于64
4、各种应用场景
- 对象存储:
用json串组织对象属性作为value存储起来,一般对象不频繁变更时用来存储
- 累加器:
对全局对象,用INCR key,一般用string类型
全局唯一值
- 分布式锁:
确保只有一个进程或某个进程中的一个线程去操作一个全局唯一值
setnx加锁,因为锁存在时返回0,就可以用来定义为加锁失败,del解锁
setnx返回1,加锁成功
- 位运算:
利用string是一个安全字符串,如应用在签到表,我们可以用位图来设置对应位的签到已否,对应位为1表示签到,为0表示未签到
如下:
setbit sign:10001:2002 1 1
表示设置用户10001在20年2月份第1天签到标识为1
sign:10001:2002为key,使用:是为了方便一些客户端工具使用,第一个1是位数,第二个1是值
获取对应第一天签到标识为:
getbit sign:10001:2002 1
获取总签到次数:
bitcount sign:10001:2002
不同编码的设计初衷是在数据量小的时候偏重于存储区效率高(占用内存少),数据量大时偏重运行速度快,避免阻塞其他业务应用请求
list:
list的关键特性是阻塞队列
消费方在请求某个key时如果不存在,则阻塞等待该key被生产方写入
利用该阻塞特性可以用来实现分布式公平锁
另外一个典型应用如**获取固定窗口数据,**像获取最近50条战绩
local record = KEYS[1]
redis.CALL(“LPUSH”, “says”, record)
redis.CALL(“LTRIM”, “says”, 0,4)
hash
对象存贮
通过field来确保唯一
可以用在对象属性经常修改场景的对象存储
同时操作多个hash字段:
hmset hash:10001 name lzs age 23 sex male
支持单独修改对象的某个属性,如
hset age 18
一次性获取所有字段值:
hgetall hash:10001
实际例子像购物车对象里面图片、名称、价格等都可作为属性
set一般用在共同交叉并集存在的场景,如共同关注
zset:
百度热榜 利用有序性
延时队列 – 将消息序列化成一个字符串作为zset的member,这个消息的到期处理时间作为score,定时查询到期的任务进行处理
分布式定时器
时间窗口限流