一、简介
redis 和 memcached 都是高性能的键值缓存数据库服务,其中 memcached 支持多线程,而 redis 支持丰富的数据结构且能内置持久化机制。
redis 数据都是以键值形式存储的,键是字符串类型,值有 7 种类型(本质上是5种,其中 HyperLogLog 是 string,而 GEO 是 zset,可以通过 object encoding keyname 查看,但由于功能上的差异较大,这里分为7种):
1、string 字符串
2、list 列表
3、set 集合(所有命令均以 S 开头)
4、hash 散列(所有命令均以 H 开头)
5、zset 有序集合(所有命令均以 Z 开头)
6、HyperLogLog
7、GEO (redis 3.2)
不同的值类型,甚至是同一种值类型,其底层实现也可能是不一样的(主要是考虑到不同情况下的效率优化),具体可以看 redis 源码。
二、常见命令
redis 的命令可以参考官网:https://redis.io/commands
对英文不熟练的也可以看国人翻译的网站:http://redisdoc.com/
以下对常见的命令进行列举
1、键操作命令
简单示例:
127.0.0.1:6379> set age 18 OK 127.0.0.1:6379> dump age "x00xc0x12ax00xb2xebxabxbcx1dxebx911" 127.0.0.1:6379> restore age1 5000 "x00xc0x12ax00xb2xebxabxbcx1dxebx911" OK 127.0.0.1:6379> get age1 "18"
2、值操作命令:String
3、值操作命令(List)
4、值操作命令(Set)
5、值操作命令(Hash)
6、值操作命令(SortedSet)
7、值操作命令(HyperLogLog)
7、值操作命令(GEO)
三、发布与订阅
redis 的发布与订阅,是以频道channel为中介,订阅者订阅相关channel,发布者向channel发送string类型消息,会通知到该channel相关的订阅者。在实际开发中,会有一些问题,其中一个问题是,客户端客观上会存在断线重连的情况,如果一个客户端在订阅了某个channel之后,断线重连了(已经不是原来的订阅者了),则需要重新订阅相关channel,而且会丢失断线期间的消息通知。另外,订阅的客户端会进行阻塞模式,一直监听 redis 通知的消息。取消订阅使用 unsubscribe ch1 [ch2] 命令,如果不带任何频道名,则表示退订所有频道,退订操作在官方提供的 redis-cli 中是无法模拟的,因为一旦执行订阅操作窗口就被阻塞了。
基于 redis 发布与订阅功能,在 redis2.8后实现了键空间通知(keyspace)和键事件通知(keyevent)的功能,前者用于当指定模式的键发生了变化时进行通知,后者用于当发生指定的操作命令时进行通知。该功能需要消耗一定的CPU资源,默认是关闭,可通过修改 redis.conf 文件或执行 config set notify-keyspace-events AKE 来开启。命令中的 "AKE" 表示开启所有类型的通知,更细化的设置请参考官方手册,可以指定具体针对具体类型的键进行 keyspace 或 keyevent 通知。
监视一个 keyspace/keyevent 的格式是 psubscribe __keyspace@<db>__:* 和 psubscribe __keyevent@<db>__:* ,如订阅 Users: 开头的键发生变化如下:
psubscribe __keyspace@0__:Users:*
而订阅删除事件的操作如下:
psubscribe __keyevent@0__:del
而如下的操作将会同时订阅 keyspace 和 keyevent,在执行类似 add key value 操作时,会收到两条通知消息:
psubscribe __key*@0__:*
四、事务
redis 在一定程度上实现了事务逻辑(不支持回滚),通过 multi/exec 包含的命令集(顺序的将其中的命令入队,如果入队成功会返回 queued,如果入队失败则会导致事务失败,即使执行exec也会返回事务错误),将以原子操作执行(需要注意的是,如果事务队列中的某些命令执行成功,而某些命令执行失败是存在的,redis 并不会回滚。在事务命令入队时,redis只会检查严重的语法格式错误,逻辑错误是没法检测的,比如对一个string键执行 lpush 操作)。 multi 命令标记着事务的开始,exec 标记事务的结束并提交事务,discard 标记着事务的结束并放弃事务。与事务常常一起配合使用的有 watch 命令,该命令用于在事务开始前监视一个 key 的内容是否发生变化。 在执行 exec 命令提交事务时,redis会检测当前的 watch 队列中的数据是否发生变化,如果发生变化,则事务将不被执行(程序可以尝试重试操作,使用乐观锁是从效率考虑)。无论提交还是放弃(exec/discard)一个事务,都会清空当前的 watch 队列,如果需要在事务开始前取消一个之前watch的操作,可以使用 unwatch 命令。
注意,如果 watch 的是一个带生存时间的键,那么即使该键过期了,redis 仍然认为其是没有变化的,事务仍可正常执行。
redis 脚本是在 redis2.6 之后引入的另一种处理事务的方法,使用脚本要更简单,并且速度更快。redis 官方表示,短时间内并不会移除原有的事务功能,但未来如果脚本被广泛使用的话并不排除这种可能。
五、服务器管理
1、慢日志
通过慢日志,可以记录执行时间较长的命令,从而便于找出项目的效率问题。
通过下面的命令可以设置当命令耗时超过多少微秒时将被记录:
config set slowlog-log-slower-than 10000
这些慢日志会记录到一个队列中,可以通过下面的命令设置队列的长度:
CONFIG SET slowlog-max-len 1000
查看慢日志可以用下面的命令,如果跟上数字,表示显示指定数量的日志:
slowlog get [number]
查看当前慢日志的数量:
slowlog len
清空慢日志:
slowlog reset
六、集群
七、redis性能测试
http://www.cnblogs.com/silent2012/p/4514901.html