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 将所有命令打包一次性发送。一次性批量执行所有命令,成功后再一次性返回所有处理结果,无法保证一致性。