特点

  • 运用 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(哈希值)

待续