文章目录
七、Redis事务
1.事务的基本操作
- 开启事物
muliti
- 作用
设定事务的开启位置,此指令执行后,后续所有的指令均加入到事务中 - 执行事务
exec
- 作用
设定事务的结束位置,同时执行事务。与muliti成对出现,成对使用 - 取消事务
discard
- 作用
终止当前事务的定义,发生在multi之后,exec之前
2.基于特定条件的事务执行
2.1 锁
- 对key添加监控锁,在执行exec前如果key发生了变化,终止事务执行
watch key1 [key2...]
- 取消对所有key的监视
unwatch
2.2 分布式锁
- 使用setnx设置一个公共锁
setnx lock-key value
利用setnx命令的返回值,有值则返回设置失败,无值则设置返回成功
操作完毕通过del操作释放锁
- 使用expire为锁key添加时间限定,到时不释放,放弃锁
expire lock-key second
pexpire lock-key milliseconds
八、数据删除策略
1.数据删除策略的目标
在内存占用与CPU占用之间寻找一种平衡,顾此失彼都会造成整体redis性能的下降,甚至引发服务器宕机或内存泄漏
2.三种删除策略—定时删除
- 创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作
- 优点:节约内存,到时就删除,快速释放掉不必要的内存占用
- 缺点:CPU压力很大,无论CPU此时负载量多高,均占用CPU,会影响redis服务器相应时间和指令吞吐量
- 总结:用处理器性能换取存储空间(拿时间换空间)
3.三种删除策略—惰性删除
- 数据到达过期时间,不做处理。等下次访问数据时
- 如果未过期,返回数据
- 如果发现已过期,删除,返回不存在
- 优点:节约CPU性能,发现必须删除的时候才删除
- 总结:用存储空间换取处理器性能(拿空间换时间)
4.三种删除策略—定期删除
- Redis启动服务器初始化时,读取配置server.hz的值,默认为10
- 每秒钟执行server.hz次serverCron()➡️databasesCron()➡️activeExpireCycle()
- activeExpireCycle()对每个expires[…]逐一进行检测,每次执行250ms/server.hz
- 对某个expires[*]检测时,随机挑选W个key检测
- 如果key超时,删除key
- 如果一轮中删除的key的数量 > W*25%,循环该过程
- 如果一轮中删除的key的数量 <= W*25%,检查下一个expires[…] ,0-15循环
- W取值(自己设)= ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP属性值
- 参数current_db用于记录activeExpireCycle()进入哪个expires[…]执行
5.逐出算法
5.1 影响数据逐出的相关配置
- 最大可使用内存
maxmemory
占用物理内存的比例,默认值为0,表示不限制。生产环境中根据需求设定通常设置为50%以上。
- 每次选取待删除数据的个数
maxmemory-samples
选取数据时并不会全库扫描,导致严重的性能消耗,降低读写性能。因此采用随机获取数据的方式作为待检测的删除数据
- 删除策略
maxmemory-polocy
达到最大内存后的,对被挑选出来的数据进行删除的策略
(1) 检测易失数据(可能会过期的数据集servr.db[i].expires)
配置 | 含义 |
---|---|
valatile-lru | 挑选最近最少使用的数据淘汰(最后一次的使用时间距现在最远) |
volatile-lfu | 挑选最近使用次数最少的数据淘汰 |
volatile-ttl | 挑选要过期的数据淘汰 |
volatile-random | 任意选择数据淘汰 |
(2) 检测全库数据(所有数据集servr.db[i].dirt)
配置 | 含义 |
---|---|
allkeys-lru | 挑选最近最少使用的数据淘汰 |
allkeys-lfu | 挑选最近使用次数最少的数据淘汰 |
allkeys-random | 任意选择数据淘汰 |
(3) 放弃数据驱逐
配置 | 含义 |
---|---|
no-enviction | 禁止驱逐数据(redis4.0默认策略),会引发OOM(Out Of Memory:内存泄漏) |
九、服务器基础配置
1.服务器端配置
- 设置服务器以守护进程的方式进行
daemonnize yes|no
- 绑定主机地址
bind 127.0.0.1
- 设置服务器端口号
port 6379
- 设置数据库数量
databases 16
2.日志配置
- 设置服务器以指定日志记录级别
loglevel debug|verbose(默认)|notice|warning
- 日志记录文件名
logfile 端口号.log
3.客户端配置
- 设置同一时间最大客户端连接数,默认无限制。当客户端连接到达上限,Redis会关闭新的连接
maxclients 0
- 客户端闲置等待最大时长,达到最大值后关闭连接。如果关闭该功能,设置为0
timeout 300
4.多服务器快捷配置
- 导入并加载指定配置文件信息,用于快速创建redis公共配置较多的redis实例文件,便于维护
include /path/server-端口号.conf
十、高级数据类型
1.Bitmaps(状态统计 0:false 1:true)
1.1 基础操作
- 获取指定key对应偏移量上的bit值
getbit key offset
- 设置指定key对应偏移量上的bit值,value只能是1或0
setbit key offset value
1.2 扩展操作
- 对指定key按位进行交、并、非、异或操作,并将结果保存到destKey中
- and:交
- or:并
- not:非
- xor:异或
bitop and|or|not|xor destKey key1 [key2...]
(
100010101
or
100001001
➡️
100011101
)
- 统计指定key中1的数量
bitcount key [start end]
2.HyperLogLog(基数/独立信息的统计)
2.1 基数
- 基数是数据集去重后的元素个数
- HyperLogLog是用来做基数统计的,运用LogLog算法
LogLog算法公式:
D
V
L
L
=
c
o
n
s
t
a
n
t
∗
m
∗
2
R
‾
DV_{LL} = constant\ast m\ast 2^{\overline{R}}
DVLL=constant∗m∗2R
HyperLogLog算法公式:
D
V
H
L
L
=
c
o
n
s
t
a
n
t
∗
m
2
∗
(
∑
j
=
1
m
2
−
R
j
)
−
1
DV_{HLL} = constant\ast m^2\ast ({\sum^{m}_{j = 1}{2^{-R_{j}}}})^{-1}
DVHLL=constant∗m2∗(j=1∑m2−Rj)−1
2.2 基本操作
- 添加数据
pfadd key element [element ...]
- 统计数据
pfcount key [key ...]
- 合并数据
pfmerge destkey sourcekey [sourcekey ...]
2.3 相关说明
- 用于进行基数统计,不是集合,不保存数据,只记录数量而不是具体数据
- 核心是基数估算算法,最终数值存在一定误差
- 误差范围:基数估计的结果是一个带有0.81%标准错误的误差
- 耗空间极小,每个hyperloglog key占用了12K的内存用于标记基数
- pfadd命令不是一次性分配12K内存使用,会随着基数的增加内存逐渐增大
- Pfmerge命令合并后占用的存储空间为12k,无论合并之前数据量多少
3.GEO(应用于地理位置信息的计算)
- 添加坐标点
geoadd key longitude latitude member [longitude latitude member ...]
- 获取坐标点
geopos key member [member ...]
- 计算坐标点距离
geodist key member1 member2 [unit]
- 根据坐标求范围内的数据
georadius key longitude latitude radius m|km|ft|mi [withcoord(显示坐标)] [withdist(显示距离)] [withhash(显示hash值)] [count count]
- 根据点求范围内数据
georadiusbymember key member radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]
- 获取指定点对应的坐标hash值
geohash key member [member ...]