Redis常用指令

  • 一、Redis介绍
  • 1.1 什么是Redis
  • 1.2 Redis优势
  • 1.3 Redis应用场景
  • 1.4 Redis下载
  • 二、Redis数据结构
  • 三、Redis常用指令
  • 3.1 String 类型
  • 3.1.1 赋值语法:SET key value
  • 3.1.2 取值语法: GET key
  • 3.1.3 设置多个键语法: MSET key value [key value …]
  • 3.1.4 获取多个键值语法: MGET key [key …]
  • 3.1.5 删除语法:DEL key
  • 3.2 字符串数字的递增与递减
  • 3.2.1 递增数字语法: INCR key
  • 3.2.2 递减数值语法: DECR key
  • 3.2.3 增加指定的整数(指定步伐)语法: INCRBY key increment
  • 3.2.4 减少指定的整数(指定步伐)语法: DECRBY key decrement
  • 3.3 Hash散列
  • 3.3.1 赋值语法: HSET key field value
  • 3.3.2 取值语法: HGET key field
  • 3.3.3 设置多个字段语法: HMSET key field value [field value ...]
  • 3.3.4 取多个值语法: HMGET key field [field ...]
  • 3.3.5 获取所有字段值语法:HGETALL key
  • 3.3.6 删除字段语法:HDEL key field [field ...]
  • 3.4 队列List
  • 3.4.1 向列表左边增加元素: LPUSH key value [value ...] (临时存储)
  • 3.4.2 从列表左边弹出元素: LPOP key(弹出后,从队列中清除)
  • 3.4.3 向列表右边增加元素 : RPUSH key value [value ...]
  • 3.4.4 从列表右边弹出元素:RPOP key
  • 3.4.5 获取列表中元素的个数: LLEN key
  • 3.4.6 查看列表语法:LRANGE key start stop
  • 3.5 Set集合
  • 3.5.1 增加元素语法:SADD key member [member ...]
  • 3.5.2 删除元素语法: SREM key member [member ...]
  • 3.5.3 获得集合中的所有元素 : smembers key
  • 3.5.4 判断元素是否在集合中: SISMEMBER key member
  • 3.6 Zset有序集合
  • 3.6.1 增加元素:ZADD key score member [score member ...]
  • 3.6.2 获得排名在某个范围的元素列表,并按照元素分数降序返回:语法:ZREVRANGE key start stop [WITHSCORES]
  • 3.6.3 获取元素的分数:ZSCORE key member
  • 3.6.4 删除元素ZREM key member [member ...]
  • 3.6.5 获得元素的分数的可以在命令尾部加上WITHSCORES参数
  • 3.6.6 应用:商品销售量、学生排名等
  • 3.6.6.1 商品编号1001的销量是9,商品编号1002的销量是10
  • 3.6.6.2 商品编号1001的销量加1
  • 3.6.6.3 商品销量排序队列中前3名
  • 3.6.6.4 学生排名前3名
  • 3.7 HyoperLogLog命令
  • 3.7.1 将指定的元素添加到指定的HyperLogLog 中:PFADD key element [element …]
  • 3.7.2 返回给定 HyperLogLog 的基数估算值:PFCOUNT key [key …]
  • 3.7.3 将多个 HyperLogLog 合并为一个 HyperLogLog:PFMERGE destkey sourcekey [sourcekey …]
  • 3.8 其他命令
  • 3.8.1 keys返回满足给定pattern 的所有key
  • 3.8.2 exists确认一个key 是否存在,存在返回1:exists key
  • 3.8.3 del删除一个key:del key
  • 3.8.4 rename重命名key:rename oldkey newkey
  • 3.8.5 type返回值的类型: type key
  • 3.8.6 设置key的生存时间:缓存的数据一般都是需要设置生存时间的,即:到期后数据销毁:EXPIRE key seconds
  • 3.8.7 获取服务器信息和统计:info
  • 3.8.8 删除当前选择数据库中的所有key:flushdb
  • 3.8.9 删除所有数据库中的所有key:flushall
  • 四、Redis的多数据库
  • 五、Redis的事务管理
  • 六、Redis发布订阅模式
  • 最后:在下篇博客补充Redis持久化和集群内容


一、Redis介绍

1.1 什么是Redis

全称:REmote DIctionary Server(远程字典服务器)。是完全开源免费的,用C语言编写的, 遵守 BCD协议。是一个高性能的(key/value)分布式内存数据库。

基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器。

Redis 与其他 key - value 缓存产品有以下三个特点:

(1) Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用;

(2) Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储;

(3) Redis支持数据的备份,即master-slave(主从)模式的数据备份。

1.2 Redis优势

(1) 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。

(2) 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操 作。

(3) 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。

(4) 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性

(5) 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消 耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消 耗;

(6) 使用多路I/O复用模型,非阻塞IO;

1.3 Redis应用场景

(1) 缓存(数据查询,短连接,新闻内容,商品内容等),使用最多

(2) 聊天室在线好友列表

(3) 任务队列(秒杀,抢购,12306等)

(4) 应用排行榜

(5) 网站访问统计

(6) 数据过期处理(可以精确到毫秒)

(7) 分布式集群架构中的session问题

1.4 Redis下载

(1) Http://redis.io/ 英文地址

(2) Http://www.redis.cn/ 中文地址

二、Redis数据结构

Redis是一种基于内存的数据库,并且提供一定的持久化功能,它是一种键值(key-value)数据库,使 用 key 作为索引找到当前缓存的数据,并且返回给程序调用者。

当前的 Redis 支持 6 种数据类型,它们分别是字符串(String)、列表(List)、集合(set)、哈希结 构(hash)、有序集合(zset)和基数(HyperLogLog)

三、Redis常用指令

指令均来自命令学习网站:http://doc.redisfans.com/index.html

默认端口号6379

3.1 String 类型
3.1.1 赋值语法:SET key value
127.0.0.1:6379> set k1 zhangsan
OK
3.1.2 取值语法: GET key
127.0.0.1:6379> get k1
"zhangsan"
3.1.3 设置多个键语法: MSET key value [key value …]
127.0.0.1:6379> mset k2 lisi k3 wangwu
OK
3.1.4 获取多个键值语法: MGET key [key …]
127.0.0.1:6379> mget k2 k3
1) "lisi"
2) "wangwu"
3.1.5 删除语法:DEL key
127.0.0.1:6379> del k3
(integer) 1
127.0.0.1:6379> get k3
(nil)
3.2 字符串数字的递增与递减
3.2.1 递增数字语法: INCR key

递增数字:当存储的字符串是整数时,Redis提供了一个实用的命令INCR,其作用是让当前键值递增, 并返回递增后的值。

127.0.0.1:6379> incr num
(integer) 1
127.0.0.1:6379> incr num
(integer) 2
3.2.2 递减数值语法: DECR key
127.0.0.1:6379> decr num
(integer) 1
3.2.3 增加指定的整数(指定步伐)语法: INCRBY key increment
127.0.0.1:6379> incrby num2 2
(integer) 2
127.0.0.1:6379> incrby num2 3
(integer) 5
3.2.4 减少指定的整数(指定步伐)语法: DECRBY key decrement
127.0.0.1:6379> decrby num2 2
(integer) 3
127.0.0.1:6379> decrby num2 1
(integer) 2
3.3 Hash散列

hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其它类型。相当于是对象格式的存储。

可以支持部分修改。

3.3.1 赋值语法: HSET key field value
# 设置一个字段值, HSET命令不区分插入和更新操作,当执行插入操作时HSET命令返回1,当执行更新操作时返回0.
127.0.0.1:6379> hset user1 username zhangsan
(integer) 1
127.0.0.1:6379> hset user1 username lisi
(integer) 0
3.3.2 取值语法: HGET key field
127.0.0.1:6379> hget user1 username
"lisi"
3.3.3 设置多个字段语法: HMSET key field value [field value …]
127.0.0.1:6379> hmset user1 password 123 age 20
OK
3.3.4 取多个值语法: HMGET key field [field …]
127.0.0.1:6379> hmget user1 password age
1) "123"
2) "20"
3.3.5 获取所有字段值语法:HGETALL key
127.0.0.1:6379> hgetall user1
1) "username"
2) "lisi"
3) "password"
4) "123"
5) "age"
6) "20"
3.3.6 删除字段语法:HDEL key field [field …]
127.0.0.1:6379> hdel user1 username
(integer) 1
127.0.0.1:6379> hgetall user1
1) "password"
2) "123"
3) "age"
4) "20"
3.4 队列List

Redis的list是采用双向链表存储数据,特点:增删快、查询慢**(Linkedlist)**.这个队列是有序的,先进先出。

3.4.1 向列表左边增加元素: LPUSH key value [value …] (临时存储)
127.0.0.1:6379> lpush alist a1 a2 123
(integer) 3
3.4.2 从列表左边弹出元素: LPOP key(弹出后,从队列中清除)
127.0.0.1:6379> lpop alist
"123"
127.0.0.1:6379> lpop alist
"a2"
3.4.3 向列表右边增加元素 : RPUSH key value [value …]
127.0.0.1:6379> rpush blist a1 a2 345
(integer) 3
3.4.4 从列表右边弹出元素:RPOP key
127.0.0.1:6379> rpush blist a1 a2 345
(integer) 3
127.0.0.1:6379> rpop blist
"345"
3.4.5 获取列表中元素的个数: LLEN key
127.0.0.1:6379> llen blist
(integer) 1
3.4.6 查看列表语法:LRANGE key start stop
# 将返回start、stop之间的所有元素(包含两端的元素),索引从0开始,可以是负数,如:“-1”代表最后的一个元素。
127.0.0.1:6379> lrange blist 0 3
1) "a2"
3.5 Set集合

Set集合类型:无序、不可重复

3.5.1 增加元素语法:SADD key member [member …]
127.0.0.1:6379> sadd ulist user1
(integer) 1
127.0.0.1:6379> sadd ulist user2
(integer) 1
127.0.0.1:6379> sadd ulist user3
(integer) 1
3.5.2 删除元素语法: SREM key member [member …]
127.0.0.1:6379> srem ulist user2
(integer) 1
3.5.3 获得集合中的所有元素 : smembers key
127.0.0.1:6379> smembers ulist
1) "user3"
2) "user1"
3.5.4 判断元素是否在集合中: SISMEMBER key member
127.0.0.1:6379> smembers ulist
1) "user3"
2) "user1"
127.0.0.1:6379> sismember ulist user2
(integer) 0
127.0.0.1:6379> sismember ulist user1
(integer) 1
3.6 Zset有序集合

Sortedset又叫zset,是有序集合,可排序的,但是唯一。 Sortedset和set的不同之处,是会给set中的元素添加一个分数,然后通过这个分数进行排序。(可用学生成绩,销售数量等来做分数)

3.6.1 增加元素:ZADD key score member [score member …]
# 向有序集合中加入一个元素和该元素的分数(score),如果该元素已经存在则会用新的分数替换原有的分数。
127.0.0.1:6379> zadd num1 20 stu1 30 stu2 40 stu3
(integer) 3
3.6.2 获得排名在某个范围的元素列表,并按照元素分数降序返回:语法:ZREVRANGE key start stop [WITHSCORES]
127.0.0.1:6379> zadd num1 10 stu4
(integer) 1
127.0.0.1:6379> zrevrange num1 0 4
1) "stu3"
2) "stu2"
3) "stu1"
4) "stu4"
3.6.3 获取元素的分数:ZSCORE key member
127.0.0.1:6379> zscore num1 stu2
"30"
3.6.4 删除元素ZREM key member [member …]
127.0.0.1:6379> zrem num1 stu2
(integer) 1
127.0.0.1:6379> zrevrange num1 0 4
1) "stu3"
2) "stu1"
3) "stu4"
3.6.5 获得元素的分数的可以在命令尾部加上WITHSCORES参数
127.0.0.1:6379> zrevrange num1 0 4 withscores
1) "stu3"
2) "40"
3) "stu1"
4) "20"
5) "stu4"
6) "10"
3.6.6 应用:商品销售量、学生排名等
3.6.6.1 商品编号1001的销量是9,商品编号1002的销量是10
ZADD sellsort 9 1001 10 1002
3.6.6.2 商品编号1001的销量加1
ZINCRBY sellsort 1 1001
3.6.6.3 商品销量排序队列中前3名
zrevrange sellsort 0 2 withscores
3.6.6.4 学生排名前3名
zrevrange stus 0 2 withscores
3.7 HyoperLogLog命令

HyperLogLog是一种使用随机化的算法,以少量内存提供集合中唯一元素数量的近似值。

HyperLogLog 可以接受多个元素作为输入,并给出输入元素的基数估算值:

  • **基数:**集合中不同元素的数量。比如 {‘apple’, ‘banana’, ‘cherry’, ‘banana’, ‘apple’} 的基数就是 3 。
  • **估算值:**算法给出的基数并不是精确的,可能会比实际稍微多一些或者稍微少一些,但会控制在合 理的范围之内。

**HyperLogLog 的优点是:**即使输入元素的数量或者体积非常非常大,计算基数所需的空间总是固定的、并且是很小的。

在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

3.7.1 将指定的元素添加到指定的HyperLogLog 中:PFADD key element [element …]
redis 127.0.0.1:6379> PFADD mykey "redis"
1) (integer) 1
redis 127.0.0.1:6379> PFADD mykey "java"
1) (integer) 1
redis 127.0.0.1:6379> PFADD mykey "mysql"
1) (integer) 1
3.7.2 返回给定 HyperLogLog 的基数估算值:PFCOUNT key [key …]
redis 127.0.0.1:6379> PFCOUNT mykey
(integer) 3
3.7.3 将多个 HyperLogLog 合并为一个 HyperLogLog:PFMERGE destkey sourcekey [sourcekey …]
3.8 其他命令
3.8.1 keys返回满足给定pattern 的所有key
# 查询以user开头的key
keys user* 
# 查询所有的key
keys *
3.8.2 exists确认一个key 是否存在,存在返回1:exists key
127.0.0.1:6379> exists num2 
(integer) 1
127.0.0.1:6379> exists num23
(integer) 0
3.8.3 del删除一个key:del key
# 删除存在的key返回1,不存在的key返回0
127.0.0.1:6379> del num1 
(integer) 1
127.0.0.1:6379> del num23
(integer) 0
3.8.4 rename重命名key:rename oldkey newkey
127.0.0.1:6379> rename k1 k11
OK
127.0.0.1:6379> keys *
1) "ulist"
2) "k2"
3) "user1"
4) "num2"
5) "clist"
6) "k11"
3.8.5 type返回值的类型: type key
127.0.0.1:6379> type ulist
set
127.0.0.1:6379> type k11
string
127.0.0.1:6379> type alist
list
3.8.6 设置key的生存时间:缓存的数据一般都是需要设置生存时间的,即:到期后数据销毁:EXPIRE key seconds
# 设置key的生存时间(单位:秒)key在多少秒后会自动删除
# TTL key 查看key剩余的生存时间
# PERSIST key 清除生存时间
127.0.0.1:6379> set a1 123
OK
127.0.0.1:6379> get a1
"123"
127.0.0.1:6379> expire a1 60
(integer) 1
127.0.0.1:6379> ttl a1
(integer) 56
127.0.0.1:6379> ttl a1
(integer) 51
127.0.0.1:6379> ttl a1
(integer) 47
3.8.7 获取服务器信息和统计:info
3.8.8 删除当前选择数据库中的所有key:flushdb
3.8.9 删除所有数据库中的所有key:flushall

四、Redis的多数据库

一个redis实例key包括多个数据库,客户端可以指定连接某个redis实例的哪个数据库,就好比一个 mysql中创建多个数据库,客户端连接时指定连接哪个数据库。

一个redis实例最多可提供16个数据库,下标从0-15,客户端默认连接第0号数据库,也可以通过select 选择连接哪个数据库,如下连接1号库:

redis 数据库设计 redis数据库常用命令_nosql

切换至0数据库下面:

redis 数据库设计 redis数据库常用命令_缓存_02

将key的数据移动到1号数据库: move key 数据库编号:

redis 数据库设计 redis数据库常用命令_非关系型数据库_03

五、Redis的事务管理

Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:

事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不 会被其他客户端发送来的命令请求所打断。

事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

一个事务从开始到执行会经历以下三个阶段: 开始事务。 命令入队。 执行事务。

  • 开始事务。
  • 命令入队。
  • 执行事务。

实例

以下是一个事务的例子, 它先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令:

示例1:

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set bookname java
QUEUED
127.0.0.1:6379> set bookname c++
QUEUED
127.0.0.1:6379> set bookname html
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) OK

示例2:

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set u1 user1
QUEUED
127.0.0.1:6379> get u1
QUEUED
127.0.0.1:6379> sadd tag c++ html java
QUEUED
127.0.0.1:6379> smembers tag
QUEUED
127.0.0.1:6379> exec
1) OK
2) "user1"
3) (integer) 3
4) 1) "java"
2) "html"
3) "c++"

六、Redis发布订阅模式

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

Redis 客户端可以订阅任意数量的频道。

下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:

redis 数据库设计 redis数据库常用命令_数据库_04

当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:

redis 数据库设计 redis数据库常用命令_redis_05