redis常见问题

1.redis数据结构

这里写图片描述

redis五种数据结构
String
Hash 优点由于Hash结构会在单个Hash元素在不足一定数量时进行压缩存储,所以可以大量节约内存(HashMap)。
List 链表
Set 集合,一堆不重复值的组合,求交集并集(HashSet创建了HashMap,HashMap中keySet来遍历set集合)。
Sorted Set 有序集合,增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列。

2.key太多,使用keys可能会导致线程阻塞

当redis中key的数量过多时,由于redis是单线程的。keys指令会导致线程阻塞,线上涉及redis的服务会停止,直到指令执行完服务才正常。故在生产环境慎用keys。

keys activity*
 1)  "activity-10"
 2)  "activity-6"
 3)  "activity-7"
 4)  "activity-8"
 5)  "activity-4"
 6)  "activity-1"
 7)  "activity-11"
 8)  "activity-9"
 9)  "activity-5"
 10)  "activity-2"
 11)  "activity-13"
 12)  "activity-3"
 13)  "activity-14"
 14)  "activity-12"

如果有这样的场景需要模糊查询keys的数量可以使用scan。scan指令可以无阻塞的提取出指定模式的key列表(对应的其他数据结构有对应的SSCAN 命令、 HSCAN 命令和 ZSCAN 命令,第一个参数总是一个数据库键)。

SCAN 命令的回复是一个包含两个元素的数组, 第一个数组元素是用于进行下一次迭代的新游标, 而第二个数组元素则是一个数组, 这个数组中包含了所有被迭代的元素。

scan 0 match activity* count 100
 1)  "0"
 2)    1)   "activity-10"
  2)   "activity-6"
  3)   "activity-7"
  4)   "activity-8"
  5)   "activity-13"
  6)   "activity-14"
  7)   "activity-12"
  8)   "activity-4"
  9)   "activity-1"
  10)   "activity-5"
  11)   "activity-2"
  12)   "activity-3"
  13)   "activity-11"
  14)   "activity-9"

可以根据返回的新游标进行遍历,当下标为0时,说明迭代结束。

scan 0 match activity* count 10
 1)  "14"
 2)    1)   "activity-10"
  2)   "activity-6"
  3)   "activity-7"
  4)   "activity-8"
  5)   "activity-13"
  6)   "activity-14"
  7)   "activity-12"
  8)   "activity-4"
  9)   "activity-1"
  10)   "activity-5"
  11)   "activity-2"

scan 14 match activity* count 10
 1)  "0"
 2)    1)   "activity-3"
  2)   "activity-11"
  3)   "activity-9"
3.setnx 注意事项

setnx是redis设置锁常用的方式,但有几个事项需要注意以下:

1.SetNX 不具备设置过期时间的功能,所以需借助 Expire 来设置。

local:0>setnx "activity_test" 1
"1"
local:0>expire "activity_test" 10
"1"

2.setnx成功,expire失败。可以通过multi/exec实现原子性,但是多个请求若没有加判断,setnx失败,但是expire会成功,那么会一直刷新expire时间。使用set参数的方式实现就可以解决这些问题。

local:0>set "activity_test" "test" nx ex 10
"OK"
local:0>get "activity_test"
"test"
4. multi or pipeline

multi 事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令原子性(atomic)地执行, 。
pipeline 将所有命令打包一次性发送。一次性批量执行所有命令,成功后再一次性返回所有处理结果,无法保证一致性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值