• content
    {:toc}

redis,重点理解Redis可以支持的数据结构(类比Java的数据结构): String,hashMap,List,Set,SortSet(特殊)。

缓存

Redis

命令在$Redis/src 下

启动

  1. 直接启动

$ redis-server

默认使用6379端口,通过—port参数自定义端口号。

$ redis-server --port 6666

  1. 脚本启动

停止

redis-cli SHUTDOWN

配置

可以将配置作为启动参数时设置,更多的是通过配置文件进行配置。

启用的方式是,将配置文件作为参数,传递给redis-server

redis-server/path/redis.conf

同时存在配置文件和配置参数时,配置参数优先级更高。

配置文件模板redis.conf位于源目录根目录。

另一种配置方式,可以在不重启的情况下,通过命令CONFIG SET,

$redis>CONFIG SET loglevel warning

同样,在运行的时候也可以通过CONFIG GET,获取当前配置 。

1
2
3
4
127.0.0.1:6379> config get loglevel
1) "loglevel"
2) "notice"
127.0.0.1:6379>

注:不是所有配置都可以通过这种方式进行配置。

控制台

发送命令

  1. 将命令作为redis-cli的参数执行

    如: redis-cli SHUTDOWN,命令行执行时,自动按照more你配置(服务器地址:127.0.0.1,端口号:6379)连接redis,通-p,-h可自定义地址和端口号redis-cli -h 127.0.0.1 -p 6379。redis提供了redis-cli PING用于测试客户端与Redis连接是否正常。

  2. 不附带参数运行redis-cli,会进入交互模式

    1
    2
    3
    4
    5
    6
    liqianlongdeMacBook-Air:src liqianlong$ ./redis-cli
    127.0.0.1:6379> ping
    PONG
    127.0.0.1:6379> echo hi
    "hi"
    127.0.0.1:6379>

命令返回值

有5种类型:

  1. 状态恢复

    status reply,提示命令是否执行成功

  2. 错误回复

    error reply,以error开头,并在后面跟上错误信息。如命令不存在或命令语法错误时。

  3. 整数回复

    integer reply,以(integer)字符串开头,并在后面跟上整数数据。

  4. 字符串回复

    bulk reply,是最常见的一种回复类型,以“”双引号将内容包裹。特殊情况,当不存在是,(nil)

  5. 多行字符串回复

    multi-bulk reply,很常见,每行都以一个序号开头。

多数据库

关系数据库可以通过建立不同的databases,实现不同的应用。

redis,可以这么理解,更多是像命名空间似得,分为不同的字典,字典与字典之间有分隔,也有联系。

在redis中,不支持自定义命名字典库名称,只能是默认的从0-16,且默认最多到16个字典库,通过配置参数databases可以进行修改或查看

1
2
3
127.0.0.1:6379> CONFIG GET databases
1) "databases"
2) "16"

通过命令select可以切换字典库,类似关系数据库的user xxxdatabase命令。

字典库之间并不是完全隔离的,通过命令如FLUSHALL会完全清空所有字典库。

所以建议不同应用应该使用不同的redis实例,同一个redis实例中不同的字典库可以用作不同的环境。

入门

Keys Pattern

符号 含义
? 匹配一个字符
* 匹配任意个(包括0个)字符
[ ] 匹配括号间指定的任意一个字符,可以使用-表示一个范围,
\x 转义符号,如 \?,*,
SET

SET bar 1

设置一个键

EXISTS

EXISTS key

判断一个键是否存在,存在返回1,否则返回0

DEL

DEL key [key ...]

删除一个或多个键,返回值为删除的数目

注:del命令不支持pattern,需要使用技巧来进行批量删除符合规则的键。

1
2
3
4
5
$ redis-cli KEYS "user:*" | xargs redis-cli DEL
通过linux的管道符

$ redis-cli DEL 'redis-cli KEYS"user:*"
通过先用redis命令keys查询符合规则的,然后当做参数传给del命令
TYPE

TYPE key

获得键值的数据类型。 返回的可能值为: string,hash,list(列表类),set,zset(有序集合类),none

LPUSH

字符串类型

增删改查

SET key value

GET key

实现了形如key="value"的目的

INCR

INCR key

如果valu是int类型,使用此命令可进行递增,返回递增后的值。

key命名

String的key没有强制规范,推荐 对象类型:对象ID:对象属性来命名一个键,多个单词之间使用.进行分隔,如: post:1:page.view,id为1的文字的浏览量

MGET、MSET

MGET key [key...]

MSET key value [key value ...]

同时获取,设置多个键值。

散列类型(Hash)

redis是一种字典结构形式存取数据的,散列类型(Hash)也是一种字典结构存取数据的。

redis中的散列类型,键值只能是字符串形式的。

redis+散列类型,构成了 键+(属性+值)的结构,其中 属性+值是散列类型,键+(散列类型)是redis的字典结构。

这样就构成了一个三层结构的数据结构,通过指定 键和属性,找到值。

增删改查
HSET、HGET

HSET key field value

HGET key field

HMSET key field value [key field value ...]

HMGET key field [key field ...]

HGETALL key

HEXISTS

HEXISTS key field

判断字段是否存在

HSETNX

HSETNX key field value

当字段不存在时,设置

HINCRBY

HINCRBY key field increment

指定键+字段,增加指定数值

HDEL

HDEL key field [field ...]

删除一个或多个字段,返回删除的字段数。

列表类型(list)

列表类型内部使用的是双向链表(double linked list)实现的,

有序,类似于数组,通过一个建名,获得真个列表值。

增删改查

LPUSH key value [value ...]

RPUSH key value [value ...]

想列表左、右添加值

LPOP key

RPOP key

从列表左、右,弹出一个值 (弹出后,删除)

LLEN

LLEN key

列表个数

LRANGE

LRANGE key start stop

截取列表部分

LREM

LREM key count value

删除列表中前count个值为value的元素。

value可以为 0, 1-9,*等pattern

LINDEX

LINDEX key index

LSET key index value

返回指定key的指定index的值

LTRIM

LTRIM key start end

值保留指定索引范围内的

LINSERT

LINSERT key BEFORE|AFTER pivot value

这个插入不是根据索引来查找然后插入的,而是根据value查找后插入, 查找值为pivot的,然后插入值为value的在其前或后。

POPLPUSH

POPLPUSH source destination

移动列表到另一个个列表的左边。

集合类型(Set)

集合的概念就是数学上的概念。在集合中每个元素都是不同的,且没有顺序。

实现方式和也是通过值为null的hashtable实现的。

增删改查
SADD

SADD key member [member]

向集合中添加一个或多个元素,已经存在的会忽略,返回成功添加的个数

SREM

SREM key member [member]

删除一个或多个元素,返回删除成功的个数

SMEMBERS

SMEMBERS key

返回集合中所有元素

SISMEMBER

SISMEMBER key member

判断一个元素是否存,存在返回1,不存在返回0

集合间的运算
SDIFF

SDIFF key [key ...]

集合间 差集运算, 集合A和集合B,差集 = A-B,即 A-B = {x|x属于A & x不属于B}

{1,2,3} - {2,3,4} = {1}

1
2
3
4
5
6
7
127.0.0.1:6379> sadd a 1 2 3
(integer) 3
127.0.0.1:6379> sadd b 2 3 4
(integer) 3
127.0.0.1:6379> sdiff a b
1) "1"
127.0.0.1:6379>
SINTER

SINTER key [key ...]

集合间交集运算,集合A和集合B, A交B = {x|x属于A&x属于B}

{1,2,3} 交 {2,3,4} = {2,3}

SUNION

SUNION key [key ...]

集合间并集运算,集合A和集合B,A并B = {x|x属于A 或 x属于B}

{1,2,3} 并 {2,3,4} = {1,2,3,4}

SCARD

SCARD key

获得集合中元素的个数

SDIFFSTORE、SINTERSTORE、SUNIONSTORE

SDIFFSTORE destination key [key ...]

SINTERSTORE destionation key [key ...]

SUNIONSTORE destionation key [key ...]

求得差集、交集、并集 后将结果的结合存在 目标 key 的集合中。

SRANDMEMBER

SRANDMEMBER key [count]

随机获得集合中的count个元素。 count为正时,元素不重复。count为负时,元素可能重复。

SPOP

SPOP key

从集合中弹出一个元素,随机的,弹出后删除。

有序集合类型

sorted set,即在集合的基础上,关联了一个分数。可以实现后去前n个分数高、低的元素

增删改查
ZADD

ZADD key score member [score member ...]

向集合中添加一个或多个元素的分数和元素,

ZSCORE

ZSCORE key member

获得元素的分数,指定键和member名称。

ZRANGE

ZRANGE key start stop [WITHSCORES]

获得索引(start到stop)的元素列表。 从小到大排序。

如果需要同时获取元素的分数,加上

ZRENRANGE

ZREVRANGE key start stop [WITHSCORES]

获得索引在某个范围的元素列表。 从大到小。

ZRANGEBYSCORE

ZRANGEBYSCORE key min max [WITHSCORES][ LIMIT offset count]

排名在某个范围内的元素。 +inf,-inf分别表示分数无穷大和无穷小。

LIMIT offset count和关系数据库类似。

ZREVRANGEBYSCORE用于从大到小。

ZINCRBY

ZINCRBY key increment member

增加一个元素的分数

ZCARD

ZCARD key

集合中元素的数量

ZCOUNT

ZCOUNT key min max

指定分数范围元素的个数

ZREM

ZREM key member [member ...]

删除

ZREMRANGEBYRANK

ZREMBREANGEBYRANK key start stop

删除指定索引范围内的所有,从小到大排序

ZREMRANGEBYSCORE

ZREMRANGEBYSCORE key min max

指定分数范围内所有元素

ZRANK

ZRANK key member

zrevrank key member

获得指定元素排名。

ZINTERSTORE

ZINTERSTORE destination numkeys key [key...] [WEIGHTS weight [weight...]][AGREGATE SUM|MIN|MAX]

计算多个有序集合的交集,并存储在destination集合内。

计算后的分数,根据 Agregate 参数决定。sum为求和,min为去较小值。

权重 weights ,集合在计算分数时,会乘以此权重。

ZUNIONSTORE

计算有序集合间的并集。

事务

MULTI ... EXEC

事务中发生错误

  1. 语法错误,不会执行
  2. 运行时错误,会执行

如果出现运行时错误,只能自己手动回滚 。

WATCH
EXPIRE

EXPIRE key seconds

设置已经存在的键,seconds秒后删除。

TTL key

查看key剩余时间

PERSIST foo

将目标key设置为永久生存。

PEXPIRE key seconds*1000

用毫秒设置剩余时间

PTTL key

毫秒返回剩余时间

EXPIREAT key

使用unix时间戳,设置key的截止时间

PEXPIREAT key

使用unix时间戳*1000毫秒设置截止时间

BRPOP

BRPOP queue,seconds

队列,弹出元素,如果队列没有元素,则等待seconds秒,直到有元素则弹出,没有返回nil。

当seconds设置为0时,则永久等待。

BLPOP

参照brpop,一个从队列左侧取得,一个从队列右侧取得。

优先级

BRPOP queue1 [queue2 queue3 ...] timeout

可以使用阻塞弹出方式,监听多个队列,此时,队列的先后顺序是有序的。 且每次只会弹出一个队列的元素。

发布、订阅

PUBLISH channel1 [channel2 ...] message

SUBSCRIBE channel [channel ...]

订阅频道, 可以订阅多个。

返回值:

  1. Subscribe, 表示订阅成功。 第二行,显示订阅的频道名称。 第三行,表示当前客户端订阅的频道数目。
  2. message,表示接收到的消息。 第二行,显示产生消息的频道。第三行,消息内容。
  3. unsubscribe,表示成功取消某个频道订阅。第二行表示取消的频道的名称,第三行,当前客户端剩余频道数目,此值为0时,会推出订阅模式。
SUBSCRIBE

订阅 指定频道名称的 频道。

UNSUBSCRIBE
PSUBSCRIBE

订阅 指定规则的 频道,支持glob风格。

PUNSUBSCRIBE