redis事务就是一个命令执行的队列,将一系列预定义命令包装成一个整体(一个队列)。当执行时,一次性 按照添加顺序依次执行,中间不会被打断或者干扰。
一个队列中,一次性、顺序性、排他性的执行一系列命令
1、开启事务 :设定事务的开启位置,此指令执行后,后续的所有指令均加入到事务中
multi
2、执行事务 :设定事务的结束位置,同时执行事务。与multi成对出现,成对使用
exec
注意:加入事务的命令暂时进入到任务队列中,并没有立即执行,只有执行exec命令才开始执行
3、取消事务 :终止当前事务的定义,发生在multi之后,exec之前
discard
1、语法错误: 指命令书写格式有误
处理结果 :如果定义的事务中所包含的命令存在语法错误,整体事务中所有命令均不会执行。包括那些语法正确的命令。 并且需要从新输入multi开启事务
2、运行错误: 指命令格式正确,但是无法正确的执行。例如对list进行incr操作
处理结果 能够正确运行的命令会执行,运行错误的命令不会被执行
注意:已经执行完毕的命令对应的数据不会自动回滚,需要程序员自己在代码中实现回滚
记录操作过程中被影响的数据之前的状态
设置指令恢复所有的被修改的项
对 key 添加监视锁,在执行exec前如果key发生了变化,终止事务执行
watch key1 [key2……]
取消对所有 key 的监视
unwatch
应用场景:redis 应用基于状态控制的批量任务执行
例如:对已经售罄的货物追加补货,4个业务员都有权限进行补货。补货的操作可能是一系 列的操作,牵扯到多个连续操作,如何保障不会重复操作?
业务分析 :
使用 setnx 设置一个公共锁
setnx lock-key value #例:setnx lock-name 1
利用setnx命令的返回值特征,有值则返回设置失败,无值则返回设置成功
注意:**setnx并不是和数据库那样的直接给key加上锁,而是使用setnx lock-key value生成一个锁(lock-key),别的客户端需要操作key时,先setnx lock-key value,如果返回1说明没加所可以操作,如果返回0说明可以已经加锁,需要等待。**上述解决方案是一种设计概念,依赖规范保障,具有风险性
操作完毕通过del操作释放锁
del lock-key #例:dellock-name
需求分析
使用 expire 为锁key添加时间限定,到时不释放,放弃锁
expire lock-key second
pexpire lock-key milliseconds
由于操作通常都是微秒或毫秒级,因此该锁定时间不宜设置过大。具体时间需要业务测试后确认。
Redis是一种内存级数据库,所有数据均存放在内存中,可以使用expire指令设置其有效期,内存中的数据可以通过TTL指令获取其状态
时效性数据的存储结构 :
数据删除策略的目标:在内存占用与CPU占用之间寻找一种平衡,顾此失彼都会造成整体redis性能的下降,甚至引发服务器宕机或 内存泄露
1、定时删除
2、 惰性删除
3、 定期删除
当新数据进入redis时,如果内存不足怎么办?
1、最大可使用内存 : 占用物理内存的比例,默认值为0,表示不限制。生产环境中根据需求设定,通常设置在50%以上。
maxmemory
2、每次选取待删除数据的个数 : 选取数据时并不会全库扫描,导致严重的性能消耗,降低读写性能。因此采用随机获取数据的方式作为待检测删除数据
maxmemory-samples
3、删除策略 :达到最大内存后的,对被挑选出来的数据进行删除的策略
maxmemory-policy
maxmemory-policy参数的相关取值:
1、检测易失数据(可能会过期的数据集server.db[i].expires )
2、检测全库数据(所有数据集server.db[i].dict )
3、放弃数据驱逐
1、设置服务器以守护进程的方式运行 (后台运行)
daemonize yes|no
2、 绑定主机地址
bind 127.0.0.1 #绑定之后只能通过127.0.0.1访问
3、设置服务器端口号
port 6379
4、设置数据库数量
databases 16
1、设置服务器以指定日志记录级别
loglevel debug|verbose|notice|warning
2、日志记录文件名
logfile 端口号.log
注意:日志级别开发期设置为verbose即可,生产环境中配置为notice,简化日志输出量,降低写日志IO的频度
1、设置同一时间最大客户端连接数,默认无限制。当客户端连接到达上限,Redis会关闭新的连接
maxclients 0
2、客户端闲置等待最大时长,达到最大值后关闭连接。如需关闭该功能,设置为 0
timeout 300
1、导入并加载指定配置文件信息,用于快速创建redis公共配置较多的redis实例配置文件,便于维护
include /path/server-端口号.conf
业务场景 :
业务分析 :使用每一位表示该电影是否被点播过
Bitmaps类型的操作 : 应用于信息状态统计
1、设置指定key对应偏移量上的bit值,value只能是1或0
setbit key offset value
2、获取指定key对应偏移量上的bit值
getbit key offset
3、 对指定key按位进行交、并、非、异或操作,并将结果保存到destKey中
bitop op destKey key1 [key2...]
4、统计指定key中1的数量
bitcount key [start end]
HyperLogLog :应用于独立信息统计
基数 :
1、添加数据
pfadd key element [element ...]
2、统计数据
pfcount key [key ...]
3、合并数据
pfmerge destkey sourcekey [sourcekey...]
相关说明:
GEO主要用于地理位置相关的计算
GEO类型的操作 :
1、添加坐标点
geoadd key longitude latitude member [longitude latitude member ...]
2、 获取坐标点
geopos key member [member ...]
3、 计算坐标点距离
geodist key member1 member2 [unit]
4、 计算key中在指定的经纬度下一定距离的范围内有多少个点
georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]
5、计算key中在member一定距离的范围内有多少个点
georadiusbymember key member radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]
6、计算位置member的hash值
geohash key member [member ...]
3、 计算坐标点距离
geodist key member1 member2 [unit]
4、 计算key中在指定的经纬度下一定距离的范围内有多少个点
georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]
5、计算key中在member一定距离的范围内有多少个点
georadiusbymember key member radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]
6、计算位置member的hash值
geohash key member [member ...]