Redis命令

1.Redis数据结构介绍

Redis是一个key-value的数据库,key一般是String类型,value的类型多种多样,value常见的八种类型:

Redis支持五种基本的数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set,有序集合)。

  • 各个数据类型应用场景:
类型 简介 特性 场景
String(字符串) 二进制安全 可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M ---
Hash(字典) 键值对集合,即编程语言中的Map类型 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去) 存储、读取、修改用户属性
List(列表) 链表(双向链表) 增删快,提供了操作某一段元素的API 1,最新消息排行等功能(比如朋友圈的时间线) 2,消息队列
Set(集合) 哈希表实现,元素不重复 1、添加、删除,查找的复杂度都是O(1) 2、为集合提供了求交集、并集、差集等操作 1、共同好友 2、利用唯一性,统计访问网站的所有独立ip 3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐
Sorted Set(有序集合) 将Set中的元素增加一个权重参数score,元素按score有序排列 数据插入集合时,已经进行天然排序 1、排行榜 2、带权重的消息队列

不同的数据类型的操作会对应不同的命令,Redis为了方便我们学习,将操作不同数据类型的命令做了不同分组分组,在官网可以查看,也可以通过命令行查看:

2.Redis通用命令

通用指令是部分数据类型都可以使用的指令,常见的可以通过官方文档选择Generic分组查看:

或者使用命令行查看:help @generic

127.0.0.1:6379> help @generic

  DEL key [key ...]
summary: Delete a key
since: 1.0.0 DUMP key
summary: Return a serialized version of the value stored at the specified key.
since: 2.6.0 EXISTS key [key ...]
summary: Determine if a key exists
since: 1.0.0 ....

这里介绍一些常见的通用命令:

  • keys 在本库中,查看符合输入模板的所有key的值:(不建议在生产环境上使用)

    #命令解释
    127.0.0.1:6379> help keys #通过help [command] 可以查看一个命令的具体用法 KEYS pattern
    summary: Find all keys matching the given pattern
    since: 1.0.0
    group: generic #例子
    127.0.0.1:6379> keys *
    1) "marry"
    2) "jack"
    127.0.0.1:6379> keys j*
    1) "jack"
  • del 删除一个或者多个key

    #命令解释
    127.0.0.1:6379> help del DEL key [key ...]
    summary: Delete a key
    since: 1.0.0
    group: generic #例子
    127.0.0.1:6379> keys *
    1) "foo"
    2) "marry"
    3) "jack"
    4) "tom"
    127.0.0.1:6379> del tom marry #一次可以删除多个key,返回的值是删除key的数量
    (integer) 2
    127.0.0.1:6379> keys *
    1) "foo"
    2) "jack"
  • exists 判断一个或多个key是否存在

    #命令解释
    127.0.0.1:6379> help exists EXISTS key [key ...]
    summary: Determine if a key exists
    since: 1.0.0
    group: generic #例子
    127.0.0.1:6379> exists jack foo tom mary #返回值是查询的key存在的个数
    (integer) 2
  • expire 给一个key设置有效期,到期时该key自动删除

    #命令解释
    127.0.0.1:6379> help expire EXPIRE key seconds
    summary: Set a key's time to live in seconds
    since: 1.0.0
    group: generic #例子
    127.0.0.1:6379> expire k1 5 #设置k1的过期时间为5秒
    (integer) 1
    127.0.0.1:6379> get k1 #5秒后查看,发现已经给被删除了
    (nil)
  • ttl 查看一个key的剩余有效期

    #命令解释
    127.0.0.1:6379> help ttl TTL key
    summary: Get the time to live for a key
    since: 1.0.0
    group: generic #例子
    127.0.0.1:6379> ttl foo
    (integer) -1 #-1 代表该key为永久有效
    127.0.0.1:6379> expire foo 5
    (integer) 1
    127.0.0.1:6379> ttl foo
    (integer) 2 #其他数字代表该key剩余时间(秒)
    127.0.0.1:6379> ttl foo
    (integer) -2 #-2 代表该key已经过期

3.String类型

string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。

根据字符串的格式不同,又可以分为3类:

  • String:普通字符串

  • int:整数类型,可以做自增、自减操作

  • float:浮点类型,可以做自增、自减操作

不管是哪种格式,底层都是字节数组形式存储,只不过是编码形式不同

  • String类型常见命令

    • set 添加或者修改已经存在的一个String类型的键值对
    • get 根据key获取String类型的value
    • mset 批量添加多个String类型的键值对
    • mget 根据多个key获取多个String类型的value
    • incr 让一个整型的value自增1
    • incrby 让一个整型的value自增并指定步长,例如 incrby num 2 #让key为num对应的value自增2
    • incrbyfloat 让一个浮点类型的数字自增并指定步长
    • setnx 添加一个String类型的键值对,前提是这个key不存在,否则不执行
    • setex 添加一个String类型的键值对,并且指定有效期

3.1key的层级格式

Redis没有类似MySQL的Table的概念,我们该如何区分不同类型的key呢?例如,需要存储用户、商品信息到redis,有一个用户id为1,有一个商品的id也恰好是1。

Redis的key允许有多个单词形成层级结构,多个单词之间用:隔开,例如:项目名:业务名:类型:id。由此我们可以根据层级关系来解决上面的问题:

user相关的key:项目名:user:1

product相关的key:项目名:product:1

如果value是一个Java对象,例如一个User对象,则可以将对象序列化为JSON字符串后存储,例如:

127.0.0.1:6379> set olien:user:1 '{"id":1, "name":"Jack", "age": 21}'
OK
127.0.0.1:6379> set olien:user:2 '{"id":2, "name":"Rose", "age": 18}'
OK
127.0.0.1:6379> set olien:product:1 '{"id":1, "name":"小米11", "price": 4999}'
OK
127.0.0.1:6379> set olien:product:2 '{"id":2, "name":"荣耀6", "price": 2999}'
OK
127.0.0.1:6379> keys olien*
1) "olien:product:1"
2) "olien:product:2"
3) "olien:user:1"
4) "olien:user:2"
127.0.0.1:6379>

我们在可视化软件查看,可以看到使用冒号隔开时,数据自然形成了不同的层级结构,这就可以避免id相同时的冲突,实现分层存储。

4.Hash类型

Hash 类型,也叫散列,其 value 是一个无需字典,类似 Java 中的 hashmap 结构。

Redis hash 是一个键值(key=>value)对集合。Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。每个 hash 可以存储 2^32 -1 键值对(40多亿)。

String结构是将对象序列化为json字符串后存储,但当需要修改对象的某个字段时很不方便:

而Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD操作:

  • Hash常见的命令

    这里的哈希表指的是一个hash类型(key-value[field-value])

    • HSET key field value[field2 value2...] 将哈希表 key 中的字段 field 的值设为 value

      127.0.0.1:6379> HSET lucy id 2 age 10
      (integer) 2
    • HGET key field 获取存储在哈希表中指定字段的值

    • HDEL key field [field2...] 删除一个或者多个哈希表key的字段

      127.0.0.1:6379> HDEL lucy addr age
      (integer) 2
    • HMSET key field1 [field2...] 同时将多个field-value(域-值)对设置到哈希表key中

      127.0.0.1:6379> hmset lucy name lucy id 5 age 18
      OK
    • HMGET key field1 [field2...] 获哈希表中给定字段的值

      127.0.0.1:6379> HMGET lucy id age name
      1) "5"
      2) "18"
      3) "lucy"
    • HGETALL key 获取一个hash类型的key中的所有field和所有value

      127.0.0.1:6379> HGETALL lucy
      1) "name"
      2) "lucy"
      3) "id"
      4) "5"
      5) "age"
      6) "18"
    • HKEYS key 获取哈希表key中的所有field

      127.0.0.1:6379> hkeys lucy
      1) "name"
      2) "id"
      3) "age"
    • HLEN key 获取哈希表key中所有字段的数量

      127.0.0.1:6379> HLEN lucy
      (integer) 4
    • HVALS key 获取哈希表key中的所有value

      127.0.0.1:6379> hvals lucy
      1) "lucy"
      2) "5"
      3) "18"
    • HINCRBY key field increment 为哈希表key中的指定字段的整数值加上增量increment

      127.0.0.1:6379> HINCRBY lucy age 100
      (integer) 118
    • HINCRBYFLOAT key field increment 为哈希表key中的指定字段的浮点数值加上增量increment

      127.0.0.1:6379> HINCRBYFLOAT lucy score 30
      "90"
    • HSETNX key field value 只有在字段不存在时,设置哈希表key中字段的值

      127.0.0.1:6379> HSETNX lucy age 10086
      (integer) 0
      127.0.0.1:6379> HSETNX lucy addr beijing
      (integer) 1
    • HEXISTS key field 查看哈希表key中,指定的字段是否存在

      127.0.0.1:6379> HEXISTS lucy age #返回值1表示存在,0表示不存在
      (integer) 1
      127.0.0.1:6379> HEXISTS lucy foo
      (integer) 0
    • HSCAN key cursor [MATCH pattern\] [COUNT count] 迭代哈希表中的键值对

5.List类型

List 是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。一个列表最多可以包含 2^32 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。

Redis 的 List类型与 Java 的LinkedList 类似,可以看做是一个双向链表结构,可以同时支持正向检索和反向检索。

特征也和 LinkedList 类似:

  • 有序
  • 元素可以重复
  • 插入和删除速度快
  • 查询速度一般

常用来存储一个有序数据,例如朋友圈点赞列表,评论列表等。

下表列出了列表相关的基本命令:

命令首字符:R代表列表右侧(Right),L代表列表左侧(Left)

命令及描述
BLPOP key1 [key2 ] timeout 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
BRPOP key1 [key2] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
BRPOPLPUSH source destination timeout 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
LINDEX key index 通过索引获取列表中的元素
LINSERT key BEFORE|AFTER pivot value 在列表的元素前或者后插入元素
LLEN key 获取列表长度
LPOP key 移出并获取列表的第一个元素
LPUSH key value1 [value2] 将一个或多个值插入到列表头部
LPUSHX key value 将一个值插入到已存在的列表头部
LRANGE key start stop 获取列表指定范围内的元素
LREM key count value 移除列表元素
LSET key index value 通过索引设置列表元素的值
LTRIM key start stop 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
RPOP key 移除列表的最后一个元素,返回值为移除的元素。
RPOPLPUSH source destination 移除列表的最后一个元素,并将该元素添加到另一个列表并返回
RPUSH key value1 [value2] 在列表中添加一个或多个值到列表尾部
RPUSHX key value 为已存在的列表添加值
  • 思考:使用List类型模拟 栈 / 队列 / 阻塞队列

根据上面的命令,我们就可以使用List类型模拟栈、队列、阻塞队列:

  1. 模拟栈:只需要入口和出口在同一边

  2. 模拟队列:入口和出口在不同边

  3. 模拟阻塞队列:入口和出口在不同边,出队时采用 BLPOP 或 BRPOP

6.Set类型

Redis 的 Set 是 string 类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)

注意:如果在无序集合中的同一个元素被添加了两次,根据集合内元素的唯一性,第二次插入的元素将被忽略。集合中最大的成员数为 2^32 - 1(4294967295, 每个集合可存储40多亿个成员)。

Redis 的 Set 结构与 Java 中的 HashSet 类似,可以看做是一个 value为 null 的 HashMap。因为也是一个哈希表,因此具备与 HashSet 类似的特征:

  • 无序
  • 元素不可重复
  • 查找快
  • 支持交集、并集、差集等功能

下表列出了 Redis 集合基本命令:

序号 命令及描述
1 SADD key member1 [member2] 向集合添加一个或多个成员
2 SCARD key 获取集合的成员数
3 SDIFF key1 [key2] 返回第一个集合与其他集合之间的差异。
4 SDIFFSTORE destination key1 [key2] 返回给定所有集合的差集并存储在 destination 中
5 SINTER key1 [key2] 返回给定所有集合的交集
6 SINTERSTORE destination key1 [key2] 返回给定所有集合的交集并存储在 destination 中
7 SISMEMBER key member 判断 member 元素是否是集合 key 的成员
8 SMEMBERS key 返回集合中的所有成员
9 SMOVE source destination member 将 member 元素从 source 集合移动到 destination 集合
10 SPOP key 移除并返回集合中的一个随机元素
11 SRANDMEMBER key [count] 返回集合中一个或多个随机数
12 SREM key member1 [member2] 移除集合中一个或多个成员
13 SUNION key1 [key2] 返回所有给定集合的并集
14 SUNIONSTORE destination key1 [key2] 所有给定集合的并集存储在 destination 集合中
15 SSCAN key cursor [MATCH pattern] [COUNT count] 迭代集合中的元素

Set命令练习:

  1. 将下列数据用redis的set集合来存储:

    • 张三的好友有:李四,王五,赵六
    • 李四的好友有:王五,麻子,二狗
    127.0.0.1:6379> sadd zs ls wu zl
    (integer) 3
    127.0.0.1:6379> sadd ls wu mz eg
    (integer) 3
  2. 利用Set命令来实现下列功能:

    • 计算张三的好友有多少人

      127.0.0.1:6379> SCARD zs
      (integer) 3
    • 计算张三和李四有哪些共同好友

      127.0.0.1:6379> SINTER zs ls #交集
      1) "wu"
    • 查询哪些人是张三的好友却不是李四的好友

      127.0.0.1:6379> SDIFF zs ls #差集
      1) "zl"
      2) "ls"
    • 查询张三和李四的好友总共有哪些人

      127.0.0.1:6379> SUNION zs ls #并集
      1) "wu"
      2) "zl"
      3) "eg"
      4) "ls"
      5) "mz"
    • 判断李四是否是张三的好友

      127.0.0.1:6379> SISMEMBER zs ls
      (integer) 1
    • 判断张三是否是李四的好友

      127.0.0.1:6379> SISMEMBER ls zs
      (integer) 0
    • 将李四从张三的好友列表中删除

      127.0.0.1:6379> SREM zs ls
      (integer) 1

7.zset(SortedSet)类型

Redis 的 Sorted Set 是一个可排序的 Set集合,与 Java 中的 TreeSet 有些类似,但底层数据结构却差别很大。SortedSet 中的每一个元素都带有一个 score 属性(double类型),redis正是通过score来为集合中的成员进行从小到大的排序,底层的实现是一个跳表(SkipList)加哈希表。zset的成员是唯一的,但分数(score)却可以重复。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

SortedSet具备下列特性:

  • 可排序
  • 元素不重复
  • 查询速度快

SortedSet常用于实现排行榜或者带权重的消息队列这样的功能。

下表列出了 redis 有序集合的基本命令:

注意:所有排名默认是升序,如果要降序则在命令的Z后面添加REV即可

序号 命令及描述
1 ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数
2 ZCARD key 获取有序集合的成员数
3 ZCOUNT key min max 计算在有序集合中指定区间分数的成员数
4 ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
5 ZINTERSTORE destination numkeys key [key ...] 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 destination 中
6 ZLEXCOUNT key min max 在有序集合中计算指定字典区间内成员数量
7 ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合指定区间内的成员
8 ZRANGEBYLEX key min max [LIMIT offset count] 通过字典区间返回有序集合的成员
9 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 通过分数返回有序集合指定区间内的成员
10 ZRANK key member 返回有序集合中指定成员的索引
11 ZREM key member [member ...] 移除有序集合中的一个或多个成员
12 ZREMRANGEBYLEX key min max 移除有序集合中给定的字典区间的所有成员
13 ZREMRANGEBYRANK key start stop 移除有序集合中给定的排名区间的所有成员
14 ZREMRANGEBYSCORE key min max 移除有序集合中给定的分数区间的所有成员
15 ZREVRANGE key start stop [WITHSCORES] 返回有序集中指定区间内的成员,通过索引,分数从高到低
16 ZREVRANGEBYSCORE key max min [WITHSCORES] 返回有序集中指定分数区间内的成员,分数从高到低排序
17 ZREVRANK key member 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
18 ZSCORE key member 返回有序集中,成员的分数值
19 ZUNIONSTORE destination numkeys key [key ...] 计算给定的一个或多个有序集的并集,并存储在新的 key 中
20 ZSCAN key cursor [MATCH pattern] [COUNT count] 迭代有序集合中的元素(包括元素成员和元素分值)

SortedSet命令练习:

将班级的下列学生得分存入Redis的SortedSet中:

Jack 85,Lucy 89,Rose 82,Tom 95,Jerry 78,Amy 92,Miles 76

127.0.0.1:6379> ZADD student 85 jack 89 lucy 82 rose 95 tom 78 jerry 92 amy 76 miles
(integer) 7

并实现如下功能:

  1. 删除Tom

    127.0.0.1:6379> ZREM student tom
    (integer) 1
  2. 获取Amy的分数

    127.0.0.1:6379> ZSCORE student amy
    "92"
  3. 获取Rose的排名

    127.0.0.1:6379> ZREVRANK student rose
    (integer) 3 #降序,从0开始,实际排名为4
  4. 查询80分以下有几个学生

    127.0.0.1:6379> ZCOUNT student 0 80
    (integer) 2
  5. 给Amy加2分

    127.0.0.1:6379> ZINCRBY student 2 amy
    "94"
  6. 查询成绩前3名的同学

    127.0.0.1:6379> ZREVRANGE student 0 2
    1) "amy"
    2) "lucy"
    3) "jack"
  7. 查出80分以下的所有学生

    127.0.0.1:6379> ZREVRANGEBYSCORE student 80 0
    1) "jerry"
    2) "miles"

day02-Redis命令的更多相关文章

  1. Redis命令拾遗二(散列类型)

    本文版权归博客园和作者吴双共同所有,欢迎转载,转载和爬虫请注明原文地址 :博客园蜗牛NoSql系列地址  http://www.cnblogs.com/tdws/tag/NoSql/ Redis命令拾 ...

  2. redis命令总结

     Redis命令总结 redis 127.0.0.1:6379> info  #查看server版本内存使用连接等信息 redis 127.0.0.1:6379> client list  ...

  3. redis如何执行redis命令

    Redis 命令 Redis 命令用于在 redis 服务上执行操作.所以我们必须要启动Redis服务程序,也就是redis安装目录下的redis-server.exe,你可以双击执行,也可以打开cm ...

  4. 常用 redis 命令(for php)

    Redis 主要能存储 5 种数据结构,分别是 strings,hashes,lists,sets 以及 sorted sets. 新建一个 redis 数据库 $redis = new Redis( ...

  5. Redis命令大全&中文解释&在线测试命令工具&在线中文文档

    在线测试命令地址:http://try.redis.io/ 官方文档:http://redis.io/commands http://redis.io/documentation Redis 命令参考 ...

  6. Redis命令

    redis的常用命令主要分为两个方面.一个是键值相关命令.一个是服务器相关命令(redis-cli进入终端) 1.键值相关命令 keys * 取出当前所有的key exists name 查看n是否有 ...

  7. redis命令参考

    http://doc.redisfans.com/ 进入redis命令行模式方式: 1.进入redis安装目录 2.运行redis-cli

  8. Redis 命令参考

    Redis 命令参考 http://redis.readthedocs.org/en/latest/index.html

  9. Redis 命令总结

    Redis命令总结   连接操作相关的命令 quit:关闭连接(connection) auth:简单密码认证 持久化 save:将数据同步保存到磁盘 bgsave:将数据异步保存到磁盘 lastsa ...

  10. redis命令大全

    redis windows下使用及redis命令 Redis 是一个开源,高级的键值对的存储.它经常作为服务端的数据结构,它的键的数据类型能够是strings, hashs, lists, sets( ...

随机推荐

  1. mybatis插入批量数据

    1 for循环重复调用dao,消耗大   2 sql语句编写插入多条,只用于少数   3 mybatis的batch插入   @Test public void testInsertBatch2() ...

  2. Python自学day03

    1.数据类型 int       1,2,3用于计算 bool    True,False用于判断 str       存储少量数据,用于操作 list       存储大量数据  [1,2,3,'a ...

  3. OSIDP-文件管理-12(end)

    概述 文件特性:可长期存储:可在进程间共享:有特定结构. 文件系统提供对文件操作的功能接口:创建.删除.打开.关闭.读和写. 域(field):基本数据单元,一个域包含一个值. 记录(record): ...

  4. Python机器学习/LogisticRegression(逻辑回归模型)(附源码)

    LogisticRegression(逻辑回归) 逻辑回归虽然名称上带回归,但实际上它属于监督学习中的分类算法. 1.算法基础 LogisticRegression基本架构源自于Adline算法,只是 ...

  5. 我的JAVA后端技术选型(2020版)

    JAVA后端技术选型(2020版)集群网关: LVS+keepalived 或 HAProxy服务网关 : zuul1.x注册中心: Eureka,Zookeeper配置中心: Spring Clou ...

  6. [小技巧]Win32 - VS中手动编辑RC文件

    用win32进行窗口编程时,如果资源文件不妥善集中管理会一不小心会删除一些资源文件,这时再进行项目编译的时候会发现rc文件因为缺失某个资源文件导致无法打开,我们常用的rc图形编辑器等于废了. 这时就需 ...

  7. ubuntu16.04+win10双系统安装

    先下载Ubuntu到电脑:http://mirrors.ustc.edu.cn/ubuntu-releases/16.04.6/ubuntu-16.04.6-desktop-amd64.iso 准备个 ...

  8. CH573 CH582 CH579蓝牙从机(peripheral)例程讲解二(广播内容修改)

    在上一篇外设例程讲解中讲述了蓝牙从机的收发接口,这样可以快速的上手,那么接下来就讲解另一个重要设置,从机的广播. 在peripheral例程中,一直是以50ms的周期进行广播,使用手机软件扫描可以获取 ...

  9. 安装mysql8.0

    安装repo源 参考mysql官方文档 参考文章 redhat7通过yum安装mysql5.7.17教程:https://www.jb51.net/article/103676.htm mysql r ...

  10. CentOS7.6 单用户模式下修改root密码

    第一种方法: 1.启动时用上下键选择要进入的内核,输入'e'进入编辑 2.可以使用上下键移动找到linux16这行编辑ro 为 rw init=/sysroot/bin/sh 并使用ctrl + x进 ...