Redis – 基于内存的键值对数据库, 强大之处在于它的值可以是数据结构.
这里先说一说Redis的几种数据类型, 也就是:
- 字符串( String )
- 列表( List )
- 哈希映射( Hashes )
- 无序集合( Set )
- 有序集合( Sorted Set )
String
字符串是Redis中最基本的值类型, 他是二进制安全的, 这意味着一个Redis字符串能包含任意类型的数据, 例如: 一张图片或者一个序列化的对象.最多支持存储512M字节的内容.
创建/修改和检索string, 使用SET和GET, 如果key已存在, 那么SET将会覆盖原值.在SET后添加参数可以使得赋值操作仅仅在Key存在/不存在的情况下成功.
1 | > set mykey somevalue |
在mykey
已经存在的情况下在SET后添加参数( 有点像MySQL
的IF EXIST
):
1 | > set mykey newval nx |
可见, nx
表明仅在key
不存在的时候进行赋值, xx
正相反.
Redis支持一次赋多个值和返回多个值, 使用mset
和mget
.( multi )
1 | > mset a 10 b 20 c 30 |
尽管是String
类型, 我们仍然可以尝试进行数学运算:
1 | > set counter 100 |
减法运算是: decr
和decrby
如果字符串不能变成数字, Redis会抛出异常:
1 | > set str "A" |
Lists
Redis中的列表是一个双端字符串列表, 按照插入顺序排序.可以添加一个元素到列表的头部或者尾部, 当一个插入元素的操作执行在一个空的Key
的时候,就会创建一个新的列表.
同样,删除列表就直接将Key
删除就行了.
1 | > rpush mylist 0 |
rpush
是将元素push到列表的最后, 而lpush
相反, 是将元素push到列表的开头, 最后的lrange
是将表中的元素列出, 后面的两个参数是分别表示开始索引和终止索引, 如果是负数n表示倒数第n个.
所以列出所有的元素的就是从开始到最后一个( lrange list 0 -1 )
每一次的push
操作都可以将多个元素一次性的放入表中.
1 | > rpush mylist 1 2 3 "foo" |
有push
就有pop
, 与push
一样, pop
同样支持两端的pop
.
1 | > lrange mylist 0 -1 |
Hashes
Redis Hashes是字符串字段和字符串值之间的映射,因此十分适合用来展现对象.
使用起来也十分简单, 同样是SET和GET.
1 | > hmset user:1000 username justin birth 1997 verified 1 |
如果是不存在的数据域, redis会返回nil
.
1 | > hmget user:1000 username birth no-such-field |
同样可以对hashes中的元素进行操作, 比如:
1 | > hincrby user:1000 birth 10 |
在Redis的Hashes中, 不知道为什么似乎没有hdecrby
这样的指令.所以如果要进行减法运算, 就加上负值好了.
Set
Redis Set是一个无序的字符串集合. 你可以以O(1)的时间复杂度 (无论集合中有多少元素时间复杂度都是常量)完成添加,删除,以及测试元素是否存在的操作.
Redis Set 拥有不允许包含相同成员的属性, 多次添加相同的元素,最终在集合里只会有一个元素。
1 | > sadd myset "1" "A" "Foo" "4" "-10" |
接下来看一下如何查看元素是否存在:
sismember用于查看集合是否存在,匹配项包括集合名和元素个数.
匹配成功返回1, 匹配失败返回0.
1 | > sismember myset 3 |
Sorted Set
Sorted Set 和 Set非常相似,是一个没有重复元素的字符串集合. 不同之处是有序集合的每一个成员都关联了一个评分(score),这个评分被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复的.
使用有序集合可以以非常快的速度(O(log(N)))添加,删除和更新元素。因为元素有序, 所以也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素.
由于Sorted Set
和Set
的首字母冲突了, 所以Redis中对于Sorted Set
操作的指令都是以Z
开头的
上面是我猜的 :)
zadd
与sadd
类似,但是在元素之前多了一个参数,这个参数便是用于排序的. (为了形成一个有序的集合)
1 | > zadd members 0 kali 1 ubuntu 2 debian |
查看集合有两种方式, ZRANGE
是查看正序的集合,ZREVRANGE
是查看反序的集合.
和上文所说的lrange
一样: 0表示集合第一个元素,-1表示集合的倒数第一个元素。
1 | > zrange members 0 -1 |
使用WITHSCORES
参数会连带返回记录值。
接下来一起来看一下Redis的其他相关命令和系统管理操作.
EXISTS and DEL
见名知意啦~`EXISTS`用来判断一个Key是否存在, 存在就返回1, 不存在就返回0;
DEL
用来删除一个键, 或者是一系列的键.返回非零表示删除成功.
非零是因为实际上
DEL
返回的是删除的条数.
1 | > set mykey m |
TYPE and KEYS
终于可以知道值的属性了!使用TYPE KEY
来获得属性描述.
1 | > set mykey "Foo" |
所有支持的类型都可能被返回, 包括: ( none, string, list, set, zset, hash ).
KEYS
用来在Redis全局进行键的搜索, 使用keys pattern
来进行检索.
1 | > set student_name 'justin' |
RANDOMKEY and CLEAR
很迷的两个指令..我认为的.
CLEAR
就相当于ctrl+l
.清屏指令
至于RANDOMKEY
, 我是没想明白用处在哪里.
RANDOMKEY
随机返回一个键名, 如果数据库为空, 则返回空字符串.
比如:
1 | > randomkey |
RENAME and RENAMENX
两个指令都是用来进行重命名的,区别在于:
RENAME 直接改名, 如果新的Key已经存在, 那么将会直接进行覆盖.
RENAMENX 在改名时, 如果新的Key已经存在, 则会报错并放弃更改.
所以更好用的应该是后面的一个.
1 | > set key value |
这样更安全对嘛?
补: DBSIZE 这个指令返回当前Redis中所有键的数量.
1 | > set key value |
Redis中的时间
限定Key的存活时间
对于任何数据都可以实现, 这主要用于临时存储, 并避免大量的DEL
操作.
指令是: expire
1 | > set key somevalue |
10s后再次执行:
1 | > get key |
查询key的存活时间
多亲切的指令, 查询key存活时间的指令是: TTL
– ( time to live )
1 | > set key 100 ex 30 |
清除所有的Key
两个指令都是用来进行清除操作的:
FLUSHDB
清空当前数据库的所有键FLUSHALL
清空所有数据库中的所有键
1 | > flushdb |
系统设置相关
Redis可以通过使用配置文件或者CLI
的方式进行配置.
指令的语法倒是同git很像.
1 | > config get requirepass |
上面是对密码CONFIG
的一个例子.
当然可以直接通过修改redis的配置文件redis.conf
来进行修改, 其他的一些可修改项也可直接从redis.conf
中获取.
从上面的例子也可以看出来, redis的config get
得到的结果是键值对形式的.
像这样查询:
1 | > config get *max-*-entries* |
如果不是为了配置, 而是想要查询redis的各项信息的话, 使用INFO
命令.
INFO [section] 可以查询redis几乎所有的信息.
section 有以下:
- server: Redis server的常规信息
- clients: Client的连接选项
- memory: 存储占用相关信息
- persistence: RDB and AOF 相关信息
- stats: 常规统计
- replication: Master/slave请求信息
- cpu: CPU 占用信息统计
- cluster: Redis 集群信息
- keyspace: 数据库信息统计
- all: 返回所有信息
- default: 返回常规设置信息
1 | > info server |