Redis笔记(4)

七、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=constantm2R
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=constantm2(j=1m2Rj)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 ...]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值