Redis
2026-10-28 21:12:17
先简单记一下,后面再更新。
Redis(Remote Dictionary Server)是一个使用ANSI C编写的支持网络、基于内存、分布式、可选持久性的键值对存储数据库。根据月度排行网站DB-Engines.com的数据,Redis是最流行的键值对存储数据库。
redis 和一些编程语言里的 map 或者字典差不多,以 key-value 的形式存储数据,redis 主要有五种数据结构,主要是 String, Hash, List, Set, Sorted Set.
一般如果要在 Windows 用 redis 好像是需要 docker 或者 wsl 吧,我没太了解过。
我日常使用的环境是 Arch Linux 系统。
在 Arch Linux 上,redis 对应的包为 valkey,这个包名倒是挺合适的。。。
sudo pacman -S valkey
每次使用需要启动 redis 服务
sudo systemctl start redis
或者是 sudo systemctl start valkey
也可以设置自动开启,但是应该没必要吧,不会每次开机都用 redis.
进入 redis 命令行客户端
redis-cli
String
键和值都是 String,类似 std::map<std::string, std::string>
插入一个新的键
SET ${key} ${val}
查看
GET ${key}
127.0.0.1:6379> SET key1 hello-world
OK
127.0.0.1:6379> get key1
"hello-world"
如果值可以被解析成整数,可以执行自增或者自减操作
INCR ${key} # 自增 1
DECR ${key} # 自减 1
支持的范围是 int64,还支持增加/减少不同的值,如果键不存在,执行 INCR/DECR,会创建一个值为 0 的然后继续操作。
当然我们可以用 SET 去修改,不过如果并发情况,可能会操作失败,而 INCR/DECR 是原子性的。
Hash
Hash 相当于每个值是一个对象,键还是字符串。
HSET 可以设置字段的值,如果不存在就新增,否则就修改。
命令行返回的数字是新增字段的数量,HGETALL ${key} 可以获取每个字段的名称和值,HGET ${key} ${field} 则是获取具体字段的值。
127.0.0.1:6379> HSET user:1 name "alice" age 20
(integer) 2
127.0.0.1:6379> HGETALL user:1
1) "name"
2) "alice"
3) "age"
4) "20"
127.0.0.1:6379> HGET user:1 name
"alice"
List
List 是双向链表
常用操作有
LPUSH ${key} ${val} # 从左边插入
RPUSH ${key} ${val} # 从右边插入
LPOP ${key} # 从左边取出
RPOP ${key} # 从右边取出
LRANGE ${key} 0 -1 # 查看所有元素(0 到 -1 表示全部)
LLEN ${key} # 查看长度
127.0.0.1:6379> LPUSH mylist a
(integer) 1
127.0.0.1:6379> LPUSH mylist b
(integer) 2
127.0.0.1:6379> RPUSH mylist c
(integer) 3
127.0.0.1:6379> LRANGE mylist 0 -1
1) "b"
2) "a"
3) "c"
127.0.0.1:6379> RPOP mylist
"a"
127.0.0.1:6379> LLEN mylist
(integer) 2
Set
Set 不存在重复元素,是无序的。
SADD ${key} ${val} # 添加元素
SMEMBERS ${key} # 查看所有元素
SISMEMBER ${key} ${val} # 判断元素是否存在
SREM ${key} ${val} # 删除元素
SCARD ${key} # 查看有多少个元素
127.0.0.1:6379> SADD tags redis mysql mongodb
(integer) 3
127.0.0.1:6379> SMEMBERS tags
1) "redis"
2) "mysql"
3) "mongodb"
127.0.0.1:6379> SISMEMBER tags redis
(integer) 1
Sorted Set
Sorted Set 是有序集合,每个元素带有一个分数,会按这个分数排序。
ZADD ${key} ${score} ${member} # 添加元素
ZRANGE ${key} 0 -1 WITHSCORES # 按分数从小到大查看
ZREVRANGE ${key} 0 -1 WITHSCORES # 按分数从大到小查看
ZSCORE ${key} ${member} # 查看某个元素的分数
ZINCRBY ${key} ${increment} ${member} # 给分数增加
score 可以是双精度浮点数
127.0.0.1:6379> ZADD rank 98 user1
(integer) 1
127.0.0.1:6379> ZADD rank 95 user2
(integer) 1
127.0.0.1:6379> ZADD rank 99 user3
(integer) 1
127.0.0.1:6379> ZREVRANGE rank 0 -1 WITHSCORES
1) "user3"
2) "99"
3) "user1"
4) "98"
5) "user2"
6) "95"