以前只是接触过redis
,只有最近才比较深入研究了下,觉得有几个重要的概念可以积累出来,以利于帮助理解redis
本文仅简述重点概念,和列举相关参考文档链接,但参见文档多来自redis
官网,足见其权威,需要深入研究的同学,可以自便。
redis
的keystore是基于key:value
的。
而value
被对待成特别的字符串结构体处理,redis
中的字符串概念显著区别于C
语言字符串,它是二进制安全的,也就是说可以存储任何二进制的串!
在
C
语言中,普通的字符串如果遇到字符’\0’或二进制的单字节零值,均会被认为是字符串的结尾但在,
redis
中是基于memcpy | memcmp ..
等mem*
的操作,带有明确的长度的参数,进行redis
系统内的字符串操作,所以,可以保证字符串的二进制安全。
redis-cli
和’lua script’如果要存储二进制数据,则需要将要存储的二进制数据编码为hex字符串
set key "{\x45\x12\x32\x13}"
redis.pcall('set', 'key', '{\\x45\\x12\\x32\\x13}')
hiredis
客户端库用
hiredis
库可以使用%b
格式化符,特别地传入地址指针和长度参数,可以将二进制流存储到redis
如果是
%s
字符串,hiredis
则根据strlen
来自主计算长度
因为
lua script
在redis
服务器端执行,可以有效避免那些需要redis-cli
一次往返,才能够实施的后续动作
lua script
脚本提供了多步操作很好的原子性操作粒度
# 注意key和参数arg之间的空格和逗号
./redis-cli --ldb --eval /tmp/script.lua mykey somekey , arg1 arg2
快捷操作上十分类似
gdb
lua-debugging
redis-cli
echo "
SET Key0 Value0
SET Key1 Value1
...
SET KeyN ValueN
" > data.txt
cat data.txt | redis-cli --pipe
pipelining
hiredis
客户端库// hiredis api
redisReply *reply;
redisAppendCommand(context,"SET foo bar");
redisAppendCommand(context,"GET foo");
redisGetReply(context,&reply); // Return of SET command
freeReplyObject(reply);
redisGetReply(context,&reply); // Return of GET command
freeReplyObject(reply);
bulk-loading
对于比较简单的分布式锁使用场景,利用如下语法格式的分布式互斥锁,已经够用。但比较复杂的分布式、高可用场景,可以阅读官网文档建议的部署方式。
SET resource_name my_random_value NX PX 30000
- 需要着重指出的是value是随机值,如果非自身则用lua脚本判断不能取消
- NX指定覆盖条件
- PX设定超时毫秒数
Distributed Locks with Redis
redis
具有的丰富的数据结构,例如,set、sorted set or list
。
使用他们可以建立一些有用的索引集合,以利于快速查阅相关keys值,避免SCAN
命令进行全库扫描!
Secondary indexing
Redis programming patterns