介绍下官网Redis编程模式

缘由

以前只是接触过redis,只有最近才比较深入研究了下,觉得有几个重要的概念可以积累出来,以利于帮助理解redis 😃

本文仅简述重点概念,和列举相关参考文档链接,但参见文档多来自redis官网,足见其权威,需要深入研究的同学,可以自便。

特点

字符串二进制安全

rediskeystore 是基于key:value的。

value被对待成特别的字符串 结构体进行处理,但redis中的字符串概念显著区别于C语言字符串,它是二进制安全的,也就是说可以存储任何二进制的串!

C语言中,普通的字符串如果遇到字符'\0'或二进制的单字节零值,均会被认为是字符串的结尾

但在,redis中是基于memcpy | memcmp ..mem*的API接口的操作,带有明确的长度的参数,进行redis系统内的字符串操作,所以,可以保证字符串的二进制安全。

如何插入二进制数据

  • redis-clilua script

如果要存储二进制数据,则需要将要存储的二进制数据编码为hexbase64 字符串,需要一个编解码的过程,建议使用base64字符串

shell 复制代码
set key "{\x45\x12\x32\x13}"
# 查看长度,长度并非4个字节长度,体现为编码字符串的长度
# 使用'hex'表示,不如直接使用base64编码
strlen key
c++ 复制代码
redis.pcall('set', 'key', base64Str)
  • hiredis客户端库

hiredis库可以使用%b格式化符,特别地传入首地址指针和长度参数,就可以将二进制流存储到redis

c++ 复制代码
uint16_t u16Value = 0x1234;
redisCommand(context, "SET %s %b", "Hello", &u16Value, sizeof(u16Value))
shell 复制代码
# 查看长度,长度为2个字节,体现为原始类型长度
strlen "Hello"

hiredis库可以真正支持二进制写入

lua 脚本

  • 高效

因为lua scriptredis服务器端执行,可以有效避免那些使用redis-cli需要一次往返,才能够实施的后续动作

  • 原子粒度

lua script脚本提供了多步操作很好的原子性操作粒度,而且往往比事务语法更快、更简单,推荐使用
transactions

lua脚本调试

shell 复制代码
# 注意key和参数arg之间的空格和逗号
./redis-cli --ldb --eval /tmp/script.lua mykey somekey , arg1 arg2

快捷操作上十分类似gdb
lua-debugging

批量处理(Bulk loading)

批量处理,可以有效减少网络IO的损耗,强烈建议使用

  • redis-cli pipelining
shell 复制代码
echo "
SET Key0 Value0
SET Key1 Value1
...
SET KeyN ValueN
" > data.txt

cat data.txt | redis-cli --pipe

pipelining

  • hiredis客户端库
c 复制代码
// 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

分布式锁(Distributed Locks with Redis)

对于比较简单的分布式锁使用场景,利用如下语法格式的分布式互斥锁,已经够用。但比较复杂的分布式、高可用场景,可以阅读官网文档建议的部署方式。

shell 复制代码
SET resource_name my_random_value NX PX 30000
  • 需要着重指出的是my_random_value是带有唯一性的值,最好满足随机性,如果非自身,则用lua脚本判断不能del
  • NX指定覆盖条件
  • PX设定超时毫秒数
    Distributed Locks with Redis

索引用法(Secondary indexing)

redis具有的丰富的数据结构,例如,set、sorted set or list

使用他们可以建立一些有用的索引集合,以利于快速查阅相关keys 值,避免SCAN命令进行全库扫描!

Secondary indexing

参考

Redis programming patterns

相关推荐
清幽竹客1 小时前
redis数据结构-09 (ZADD、ZRANGE、ZRANK)
数据结构·数据库·redis
hycccccch4 小时前
Redis的IO多路复用
数据库·redis·缓存
showmethetime5 小时前
搭建高可用及负载均衡的Redis
运维·redis·负载均衡
Aric_Jones7 小时前
lua入门语法,包含安装,注释,变量,循环等
java·开发语言·git·elasticsearch·junit·lua
张哈大7 小时前
【 Redis | 实战篇 秒杀实现 】
数据库·redis·缓存
程序员曼布9 小时前
主从架构:技术原理与实现
redis·mysql·架构
jstart千语14 小时前
【Redis】分布式锁的实现
数据库·redis·分布式
亚林瓜子14 小时前
AWS EC2源代码安装valkey命令行客户端
redis·云计算·aws·cli·valkey
专注代码七年16 小时前
在Windows 境下,将Redis和Nginx注册为服务。
windows·redis·nginx
智_永无止境16 小时前
Redis 8.0携新功能,重新开源
数据库·redis·开源