介绍下官网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

相关推荐
wkj00122 分钟前
php操作redis
开发语言·redis·php
Ljw...39 分钟前
索引(MySQL)
数据库·mysql·索引
菠萝咕噜肉i1 小时前
超详细:Redis分布式锁
数据库·redis·分布式·缓存·分布式锁
登云时刻2 小时前
Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(二)
redis·容器·kubernetes
Dlwyz5 小时前
redis-击穿、穿透、雪崩
数据库·redis·缓存
工业甲酰苯胺7 小时前
Redis性能优化的18招
数据库·redis·性能优化
Oak Zhang10 小时前
sharding-jdbc自定义分片算法,表对应关系存储在mysql中,缓存到redis或者本地
redis·mysql·缓存
门牙咬脆骨11 小时前
【Redis】redis缓存击穿,缓存雪崩,缓存穿透
数据库·redis·缓存
门牙咬脆骨11 小时前
【Redis】GEO数据结构
数据库·redis·缓存
墨鸦_Cormorant13 小时前
使用docker快速部署Nginx、Redis、MySQL、Tomcat以及制作镜像
redis·nginx·docker