likes
comments
collection
share

Redis 作弊表(更新中)

作者站长头像
站长
· 阅读数 13

特点

  • 使用 ANSI C 编写,支持大部分 POSIX 系统,推荐使用 Linux。官方不支持 Windows
  • Redis 基于 BSD 许可证,这是一种宽松的许可证,适用于需要自由使用和修改软件的项目
  • 支持原子操作
  • 使用内存数据集
  • 通过定期存盘或者备份每个命令来实现持久化
  • 支持事务、发布订阅、Lua 脚本、过期时间(Expire)、自动故障转移
  • 缓存淘汰策略支持 Least Recently Used(淘汰最长时间未被使用的) 、 Least Frequently Used(淘汰使用次数最少的)和其他策略。
  • 通过 Redis Sentinel 保证高可用性
  • 通过 Redis Cluster 来进行水平扩展

数据结构

  1. strings 字符串

  2. lists 列表

  3. sets 集合

  4. hashes 哈希表

  5. sorted sets 有序集合

  6. streams 流

  7. geo (geospatial) 地理坐标

  8. HyperLogLog 用于估算集合的元素个数

  9. bitmaps 基于字符串的一组二进制位(0或1),可以认为是位向量。

  10. bitfield 用于对字符串中的二进制位进行批处理。

Redis 服务器

  • 默认绑定到 0.0.0.0 且不开启身份验证。
  • 默认端口 6379,如果你需要集群则会用到 16379 端口,如果你需要哨兵则会用到 26379 端口
  • 使用配置文件中的 bind 指令可以修改监听为 127.0.0.1
  • 使用配置文件中的 requirepass 可以添加身份验证
  • 默认情况下 Redis 仅会在一段时间后自动保存数据集

Redis 客户端命令

可以使用 redis-cli ping 来执行 ping 指令

$ redis-cli ping
# 或者
$ redis-cli -h 1.1.1.1 -p 6666 -a password1234 ping
# 还可以选择数据库

$ redis-cli FLUSHALL
OK
$ redis-cli -n 1 INCR a
(integer) 1
$ redis-cli -n 1 INCR a
(integer) 2
$ redis-cli -n 2 INCR a
(integer) 1

# 还可以使用 URI 模式
$ redis-cli -u redis://LJenkins:p%40ssw0rd@redis-16379.hosted.com:16379/0 PING
PONG

# 还可以重复运行多次,其中 -r -1 表示无限运行
$ redis-cli -r 5 INCR counter_value
(integer) 1
(integer) 2
(integer) 3
(integer) 4
(integer) 5

$ redis-cli --stat
进入统计模式,很好用

$ redis-cli --bigkeys
扫描大键

$ redis-cli --scan | head -10
获取 key list
$ redis-cli --scan --pattern '*-11*'
搜索 key
$ redis-cli --scan --pattern 'user:*' | wc -l
统计 key 的数量

$ redis-cli MONITOR
进入监控模式

$ redis-cli --latency 
统计延迟情况

$ redis-cli --rdb /tmp/dump.rdb
备份 server 的数据到文件

$ redis-cli --lru-test 10000000
通过压力测试来检测命中率
156000 Gets/sec | Hits: 4552 (2.92%) | Misses: 151448 (97.08%)
153750 Gets/sec | Hits: 12906 (8.39%) | Misses: 140844 (91.61%)

也可以先输入 redis-cli 然后在交互式命令行中输入 ping:

127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set key1 value1
OK
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379> SELECT 2
OK
127.0.0.1:6379[2]> DBSIZE
(integer) 1
127.0.0.1:6379[2]> SELECT 0
OK
127.0.0.1:6379> DBSIZE
(integer) 503
127.0.0.1:6379> 5 INCR mycounter
(integer) 1
(integer) 2
(integer) 3
(integer) 4
(integer) 5
127.0.0.1:6379> help
查看帮助
127.0.0.1:6379> help @set
查看 set 的相关命令
127.0.0.1:6379> help SADD
查看命令的文档help

Key

Redis 的 key 是二进制安全的,字符串、图片和空字符串都可以作为 key。但建议:

  1. key 不应该太长,太长的时候可以使用 SHA1 之类的哈希作为 key
  2. key 也没有必要太短,"u1000flw" 不如 "user:1000:followers"
  3. key 最大可以到 512MB,value 最大也可以到 512MB

读写(set get)

> set mykey newval nx    此处 nx 的意思是仅在键不存在时才设置键值
(nil)
> set mykey newval xx    此处 xx 的意思是仅在键已经存在时才设置键值
OK
> GETSET key value       设置新值,返回原值
> mset a 10 b 20 c 30    一次性 set 多个 key
OK
> mget a b c             一次性 get 多个 key
1) "10"
2) "20"
3) "30"
> incr counter           自增1,原子操作
> incrby counter 50      自增50
> DECR counter           自降1
> DECRBY counter 50      自降50
> exists mykey           检查 key 是否存在
(integer) 1              1 表示存在,0 表示不存在
> del mykey              删除 key 和 value
(integer) 1              1 表示删除成功,0 表示没有 key
> type mykey             获取数据类型
none             
> expire key 5           5 秒钟后过期
(integer) 1              成功
(5秒钟后)
> get key 
(nil)
> set key 100 ex 10      10 秒钟后过期
OK
> ttl key
(integer) 9              还有 9 秒可以活

List 列表

Redis 的列表是通过链表实现的。这使得在头尾插入新元素都可以在常数时间内完成。缺点是通过索引来访问元素会比较慢,时间复杂度为 O(n)。

如果你需要经常访问中间位置的元素,那么推荐使用有序集合。

> rpush mylist A                     在 mylist 尾部插入 "A"
(integer) 1
> rpush mylist B                     在 mylist 尾部插入 "B"
(integer) 2
> lpush mylist first                 在 mylist 头部插入 "first"
(integer) 3
> lrange mylist 0 -1                 提取 0 ~ len-1 位置上的元素
1) "first"
2) "A"
3) "B"
> rpush mylist 1 2 3 4 5 "foo bar"   一次插入多个元素
(integer) 9
> rpop mylist                        弹出 mysql 尾部的元素,如果没有元素会返回 nil,且 key 消失
> ltrim mylist 0 2                   只保留 0 ~ 2 位置上的元素

> brpop tasks 5                      等待列表 tasks 中的元素,但如果5秒后没有可用元素,则返回 null

Hashes(哈希值)

待续