C++后端开发(4.3.1)——Redis相关命令详解及其原理
小节提纲
string,set,zset,list,hash
分布式锁的实现
lua脚本解决ACID原子性
Redis事务的ACID性质分析
1.Redis简介
Redis(Remote Dictionary Server ),即远程字典服务
Redis 是内存数据库,KeyValue数据库,数据结构数据库
Redis命令查询
2.应用
- 记录朋友圈点赞数、评论数和点击数(hash) 记录朋友圈说说列表(排序),便于快速显示朋友圈(list)
- 记录文章的标题、摘要、作者和封面,用于列表页展示(hash)
- 记录朋友圈的点赞用户ID列表,评论ID列表,用于显示和去重计数(zset)
- 缓存热点数据,减少数据库压力(hash)
- 如果朋友圈说说ID是整数id,可使用redis来分配朋友圈说说id(计数器)(string)
- 通过集合(set)的交并差集运算来实现记录好友关系(set)
- 游戏业务中,每局战绩存储(list)
3.安装编译
git clone https://gitee.com/mirrors/redis.git -b 6.2
cd redis
make
make test
make install
# 默认安装在 /usr/local/bin
# redis-server 是服务端程序
# redis-cli 是客户端程序
4.开启
mkdir redis-data
# 把redis文件夹下 redis.conf 拷贝到 redis-data
# 修改 redis.conf
# requirepass 修改密码 123456
# daemonize yes
cd redis-data
redis-server redis.conf
# 通过 redis-cli 访问 redis-server
redis-cli -h 127.0.0.1 -a 123456
5.关闭
这里有3种方式,
# 1.在服务端Ctrl+C,直接退出;
# 2.通过客户端关闭命令:
redis-cli shutdown
# 3.不小心自己使用Ctrl+Z,停止了,可以在客户端关闭,或者找到这个进程将其杀死;
kill -9 **** #这里****是redis这个进程号
6. 认识Redis
7.Redis 存储结构
8.Redis编码方式
9.STRING
字符数组,该字符串是动态字符串 raw,字符串长度小于1M 时,加倍扩容;
超过 1M 每次只多扩1M;字符串最大长度为 512M;
注意:redis 字符串是二进制安全字符串;
可以存储图片,二进制协议等二进制数据;
9.1基础命令
# 设置 key 的 value 值
SET key val
# 获取 key 的 value
GET key
# 执行原子加一的操作
INCR key
# 执行原子加一个整数的操作
INCRBY key increment
# 执行原子减一的操作
DECR key
# 执行原子减一个整数的操作
DECRBY key decrement
# 如果key不存在,这种情况下等同SET命令。 当key存在时,什么也不做
SETNX key value
# 删除 key val 键值对
DEL key
# 设置或者清空key的value(字符串)在offset处的bit值。
SETBIT key offset value
# 返回key对应的string在offset处的bit值
GETBIT key offset
# 统计字符串被设置为1的bit数.
BITCOUNT key
9.2存储结构
字符串长度小于等于 20 且能转成整数,则使用 int 存储;
字符串长度小于等于 44,则使用 embstr 存储;
字符串长度大于 44,则使用 raw 存储;
9.3应用
9.3.1 对象存储
SET role:10001 '{["name"]:"mark",["sex"]:"male",["age"]:30}'
GET role:10001
9.3.2 累加器
# 统计阅读数 累计加1
incr reads
# 累计加100
incrby reads 100
9.3.3 分布锁
# 加锁
setnx lock 1
# 释放锁
del lock
# 1. 排他功能 2. 加锁行为定义 3. 释放行为定义
9.3.4 位运算
# 月签到功能 10001 用户id 202106 2021年6月份的签到 6月份的第1天
setbit sign:10001:202106 1 1
# 计算 2021年6月份 的签到情况
bitcount sign:10001:202106
# 获取 2021年6月份 第二天的签到情况 1 已签到 0 没有签到
getbit sign:10001:202106 2
10.LIST
双向链表实现,列表首尾操作(删除和增加)时间复杂度 O(1) ;查找中间元素时间复杂度为
O(n) ;
列表中数据是否压缩的依据:
1. 元素长度小于 48,不压缩;
2. 元素压缩前后长度差不超过 8,不压缩;
10.1基础命令
# 从队列的左侧入队一个或多个元素
LPUSH key value [value ...]
# 从队列的左侧弹出一个元素
LPOP key
# 从队列的右侧入队一个或多个元素<