Redis相关知识点总结

数据结构

String

方法:set、get、del、incr、decr

> set str adb
OK
> get str
adb
> del str
1
> get str
null
> set str 2
OK
> incr str
3
> get str
3
> decr str
2

场景:
1.缓存
2.计数器
3.session

Hash

即键值对结构。
方法:hset、hget、hdel、hgetall

> hset abc ddd toryxu
0
> hset abc fff toryxu
1
> hget abc fff
toryxu
> hdel abc fff
1
> hgetall abc
ddd
toryxu
> hset abc aaa toryxu
1
> hgetall abc
ddd
toryxu
aaa
toryxu

场景:
1.缓存

List

双端链表。
lpush+lpop = 栈,先进先出
lpush+rpop = 队列,先进后出
lpush+ltrim = 有限集合
ltrim:下标 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
lpush+brpop = 消息队列
brpop:获取并移除右边最后一个元素。

> rpush list1 a
2
> rpush list1 b
3
> brpop list1 0(0是timeout超时等待时间)
list1
b
> llen list1
2
> ltrim list1 1 -1
OK
> llen list1
1

Set

无序、不重复的集合。
方法:
sadd、srem、scard(获得集合数量)、smembers(展示集合元素)、sismember(判断是否存在于集合,是返回1,否返回0)

> sadd test 1 2 3 4
0
> srem test 1
1
> smembers test
2
3
4
> sismember test 3
1
> scard test
3

场站:
1.收藏、点赞
2.给用户打标签

ZSet

有序、不重复的集合,给每个元素设置一个分数
方法:
zadd、zrange、zscore

> zadd ztest 100 abc 90 bcd
2
> zrange ztest 0 1
bcd
abc
> zrange ztest 0 1 withscore
ERR syntax error
> zrange ztest 0 1 withscores
bcd
90
abc
100
> zscore ztest abc
100
> zrevrange ztest 0 1 withscores
abc
100
bcd
90

场景:
1.排行榜

Redis持久化方式

RDB

生成快照
save 900 1 (每900s有一个写入,则备份,可以多个设置组合使用)

优点:
子进程生成快照,恢复速度快。
缺点:
保存频率不够快,服务器故障可能导致数据丢失。

AOF

记录所有写操作,在服务重启的时候再执行一遍。
fsync配置将写操作存储到磁盘的周期:

always: 每个事件周期都同步刷新一次
everysec: 每一秒都同步刷新一次
no: 我只管写,让操作系统自己决定什么时候真正写入吧

优点:
就算出现服务器故障,也不会丢失太多数据。
缺点:
AOF文件更大,性能占用更高。

Redis为什么这么快

1.基于内存实现
数据都是存在内存,只有持久化的时候存到磁盘。

2.单线程执行避免上下文切换

3.高效的数据结构

List:
双端链表,头尾指针,并且在头指针上存储len。
Hash:
hash本身。
zSet:
跳表,链表的基础上增加多级索引。

4.合理的数据编码

String:存储数字的话,采用int类型的编码,如果是非数字的话,采用 raw 编码;

List:字符串长度及元素个数小于一定范围使用 ziplist 编码,任意条件不满足,则转化为 linkedlist 编码;

Hash:hash 对象保存的键值对内的键和值字符串长度小于一定值及键值对;

Set:保存元素为整数及元素个数小于一定范围使用 intset 编码,任意条件不满足,则使用 hashtable 编码;

Zset:zset 对象中保存的元素个数小于及成员长度小于一定值使用 ziplist 编码,任意条件不满足,则使用 skiplist 编码。

Redis集群

待完善。

### Redis 相关知识点总结 #### 性能特性 Redis 是一种高性能的内存型数据库,其读取速度可达每秒 110,000 次,写入速度可达每秒 81,000 次[^1]。相比之下,传统的关系型数据库 MySQL 的读写性能较低,分别约为 5,000 和 3,000 每秒。 #### 数据结构支持 Redis 提供丰富的数据结构支持,包括字符串 (String)、列表 (List)、集合 (Set)、有序集合 (ZSet) 和哈希表 (Hash)[^1]。这些数据结构使得开发者能够灵活处理各种场景下的缓存需求。 #### 原子性和事务保障 所有的 Redis 操作都具有原子性特征,即每次操作要么完全成功,要么彻底失败[^1]。这种设计确保了在并发环境下的数据一致性。 #### 持久化机制 为了防止因服务中断而导致的数据丢失,Redis 支持两种主要的持久化方式:RDB 快照和 AOF 日志。其中,AOF(Append Only File)通过持续追加的形式记录每一次写操作至文件中,在系统重启时可通过重放日志恢复最新状态[^4]。 #### 集群架构与查询路由 在分布式环境中,Redis 使用集群模式分担压力并提高可用性。不同于简单的单机版或者主从复制方案,Cluster 实现了一种特殊的查询路由逻辑——并非单纯依赖服务器间转发请求完成定位目标节点的任务,而是借助客户端主动参与跳转过程抵达最终目的地[^2]。 #### 分布式锁实现原理 利用 SET 命令配合特定选项可以轻松构建高效的分布式锁解决方案。例如,“SET key value NX PX milliseconds”语句用于尝试获取一把带有超时期限的独占锁,这里的关键参数解释如下: - `NX` 表示仅当指定键不存在时才创建; - `PX milliseconds` 定义了解锁前的有效存活时间(单位毫秒),从而有效规避潜在死锁风险[^3]。 ```python import redis from uuid import uuid4 def acquire_lock(client: redis.Redis, lock_name: str, timeout_ms=30000): identifier = str(uuid4()) result = client.set(lock_name, identifier, nx=True, px=timeout_ms) return bool(result), identifier def release_lock(client: redis.Redis, lock_name: str, identifier: str): lua_script = """ if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end""" output = client.eval(lua_script, 1, lock_name, identifier) return True if output != 0 else False ``` 以上代码片段展示了如何基于 Python 结合官方驱动程序安全地管理分布式锁资源。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值