Redis(Remote Dictionary Server)

redis 的可执行文件有

1
2
3
4
5
6
redis-server redis 服务器
redis-cli redis 命令行客户端
redis-benchmark redis 性能测试工具
redis-check-aof aof文件修复工具
redis-check-dump rdb 文件检查工具
启动redis 即运行redis-server.

启动redis

直接启动

直接运行 redis-server 即可启动redis. redis 服务器默认使用6379端口。

通过 –port 参数可以自定义端口号。

初始化脚本启动redis

停止redis

强行终止redis 进程可能导致数据丢失

应该使用命令 redis-cli SHUTDOWN。当 redis 收到shutdown 命令后,会先断开所有客户端连接,然后根据配置执行持久化。最后完成退出。

redis 命令行客户端

发送命令
1
2
3
redis-cli -h 127.0.0.1 -p 6379
不带参数的执行
redis-cli 会进入交互模式,可以自由输入命令

多数据库

一个redis实例提供了多个用来存储数据的字典,客户端可以指定讲数据存储在哪个字典中,每一个字典相当于一个独立的数据库。

每个数据库对外都是以一个从0开始的递增数字命名,redis 默认支持16个数据库。客户端与redis 建立连接后会自动选择0号数据库,不过随时可以使用select 命令更换数据库

1
2
3
4
redis> select 1
OK
redis[1] > GET foo
(nil)

redis 不支持自定义数据库的名字,每个数据库都以编号命名,开发者自己记录每个数据库里有哪些数据,多个数据库之间也不是完全隔离的。不同的应用应该使用不同的redis 实例存储数据。一个空的redis 实例占用1 MB 左右。

数据类型

1 获得符合规则的键名列表 KEYS pattern

pattern 支持glob 风格通配符。比如 KEYS * 获得所有的键。

2.判断键的存在性 EXISTS key 存在返回1 否则 0

3.删除键 DEL key

4 TYPE key 获得键值的数据类型

字符串

可以存储任何形式字符串,包括了二进制数据。可以用其存储用户的邮箱,JSON化的对象甚至一张图片。

1 赋值与取值

1
2
SET key value
GET key

2 递增数字

1
INCR key

当存储的字符串是整数形式时,INCR 使当前 键值 递增,并返回增加后的值。

3 增加指定的整数

1
2
3
4
5
INCRBY key increment
redis> INCRBY bar 2
(integer) 2
redis> INCRBY bar 3
(integer) 5

4减少指定的整数

1
DECR key

5 增加指定浮点数 INCRBYFLOAT key increment

6 向尾部追加值 append key value append的作用时向键值的末尾追加value,如果键不存在就将该键的值设置为value。

7 获取字符串长度 STRLEN key(返回键值的长度)

8 同时获得/设置多个键值 MGET key1 key2/MSET key1 v1 key2 v2

散列类型

散列类型的键值也是一种字典结构。其中存储了字段和字段值的映射。 但是字段值只能是字符串。不支持其它数据类型。散列类型适合存储对象,使用对象类别和ID构成键名,使用字段表示对象的属性,而字段值则存储属性值。

12

1 赋值与取值

1
2
3
4
5
6
7
8
HSET key field value
HGET key field
redis> HSET car price 400
(integer)1
redis>HSET car name BMW
(integer)1
redis>HGET car name
"BMW"

HSET 不区分插入和更新操作,所以不用事先对存在性进行判断。插入时,返回 1 更新时,返回0

1
2
3
4
5
6
// HMSET 设置多个值
redis>HMSET key field1 value1 field2 value2
//HMGET 获取多个值
redis>HMGET car price name
1) "500"
2) "BMW"

2 判断字段是否存在

1
HEXISTS key field //存在返回 1 否则返回0 键不存在也返回0

3 字段不存在时赋值 (存在时不执行)

1
HSETNX key field value

4 增加数字

1
HINCRBY key field increment//字段值增加指定整数

5 删除字段

1
HDEL key field

6 只获取字段名

1
HKEYS key

7 只获取字段值

1
HVALS key

8 获取字段数量

1
HLEN key

9 获取所有field

1
hkeys key

10 获取所有value

1
hvals key

列表类型

列表类型可以存储一个有序的字符串列表,常用操作时向列表两端添加元素,或者获得列表的某一个片段。

列表类型内部使用双向链表实现,

1.向列表两端添加元素

1
2
LPUSH key value//向列表左边添加元素,返回值表示添加元素后元素的长度。
RPUSH key value// 向右边添加元素。两个命令都支持添加多个命令。

2.向列表两端弹出元素

1
2
LPOP key//返回被移除的元素值。
RPOP key

3.获取列表中元素个数

1
LLEN key //复杂度o(1) 会直接读取现成的值。

4 获取列表片段

1
LRANGE key start stop//start 和 stop都是索引。从0开始

5 删除列表中指定的值

1
2
3
4
LREM key count value// 删除前count个值为value的元素。
count>0 从左边开始删除前count个值为value的元素。
count<0 从右边开始删除。
count=0 删除所有值为value的元素。

6.获得/设置指定索引的元素值

1
2
LINDEX key index
LSET key index value

如果要将列表类型当数组用,LINDEX命令不可少,LINDEX命令用来返回指定索引的元素。

7 只保留列表指定片段

1
LTRIM key start end

8 向列表插入元素

1
LINSERT key BEFORE|AFTER pivot value

首先会在列表中从左到右查找值为pivot的元素,然后根据BEFORE|BEFER 来决定将 value 插前面还是后面。

9 将元素从一个列表移到另一个列表

1
RPOPLPUSH source destination

10. 阻塞式弹出

1
2
blpop key timeout
brpop key timeout

集合类型

集合中每个元素时不同的,且没有顺序。一个集合类型键可以存储之多2^32-1个字符串。集合类型在redis内部时使用值为空的散列表实现的。

1.增加/删除元素

1
2
3
4
5
6
SADD key member
redis> SADD letters a
(integer) 1
redis> SADD letters a b c
(integer) 2
SREM key member 删除元素

SADD 命令用来向集合中增加一个或多个元素,键不存在则会自动创建。

2 获得集合中所有的元素

1
SMEMBERS key

3 判断元素是否在集合中

1
SISMEMBER key member

4 集合间运算

1
SDIFF key1 key2 差集/SINTER key1 key2 交集运算/SUNION key1 key2并集运算

5 获得集合中元素个数

1
SCARD key

6 进行集合运算并将结构存储

1
2
3
SDIFFSTORE destination key
SINTERSTORE destination key
SUNIONSTORE destination key 结果存储在destination 中

7 随机获得集合中一个元素

1
SRANDMEMBER key

8 从集合中弹出一个元素

1
SPOP key

有序集合

在集合类型的基础上为集合中的每个元素关联了一个分数,虽然集合中每个元素时不同的,但是他们的分数可以相同。

1 增加元素

1
ZADD key score member

ZADD 命令向有序集合中加入一个元素和该元素的分数,返回新加入到集合的元素个数。

2 获得元素的分数

1
ZSCORE key member

3 获得排名在某个范围的元素列表

1
ZRANGE key start stop// start stop 都是索引

zrange 命令会按照元素分数从小到大的顺序返回索引从start到stop之间的所有的元素

4 获得指定分数范围的元素

1
ZRANGEBYSCORE key min max

5 增加某个元素的分数

1
ZINCRBY key increment member

6 获得集合中元素的数量

1
ZCARD key

7 获得指定分数范围内的元素个数

1
ZCOUNT key min max

8删除一个或者多个元素

1
ZREM key member

事务

redis 中的事务是一组命令的集合,事务同命令一样都是redis 的最小执行单位。

先用MULTI命令告诉redis 下面所有都是一个事务,EXEC命令告诉redis 结束了。

WATCH

有些时候需要知道一条命令的返回值,再根据返回值进行下一步操作,Watch指令可以监控一个或者多个键,一旦其中有一个键被修改或者删除,之后的事务就不会执行,监控一直持续到EXEC命令。

### 生存时间

在redis 中可以使用EXPIRE 命令设置一个键的生存时间,到时间后redis 会自动删除它。

1
2
3
EXPIRE key seconds//单位时秒
TTL key // 返回剩余的时间
PRESIST key // 将键设置成永久的

排序

##### 有序集合的集合操作

集合类型提供了强大的集合操作命令,但是如果需要排序就要用到有序集合类型。

sort

sort 命令可以对列表类型,集合类型和有序集合类型键进行排序,

sort 指令的by 参数

by 参数的语法为by 参考键 参考键可以时字符串类型键或者时散列类型键的某个字段(表示为键名-> 字段名)若提供了by参数,sort命令将不再依据元素自身的值进行排序,而是对每个元素使用元素的值替换掉参考键的第一个*并取出其值。然后对该值进行排序。

get参数

get参数不影响排序,它的作用是使sort命令的返回结果不再时元素自身的值,而是get参数中指定的键值。也是用×作为占位符。