Redis数据存储操作命令

  1. 查看Redis中的key
    1. keys *
  1. 基于key-value形式存储和获取数据
    命令格式 ```shell

    存储数据

    set 数据名(key) 数据值(value)

获取数据

get 数据名(key)

  1. <br />示例:
  2. ```shell
  3. 127.0.0.1:6379> set java lanague
  4. OK
  5. 127.0.0.1:6379> get java
  6. "lanague"
  7. 127.0.0.1:6379>
  1. 清除Redis中的数据
    一个Redis中有下标为0-15的数据库,默认为下标为0的数据库,可以使用select命令来进入指定数据库
    命令格式 ```shell

    清除当前数据库数据

    flushdb

清除所有数据库数据

flushall

进入指定数据库

select 数据库下标

  1. <br />示例:
  2. ```shell
  3. 127.0.0.1:6379> flushdb
  4. OK
  5. 127.0.0.1:6379> flushall
  6. OK
  7. 127.0.0.1:6379> SELECT 15
  8. OK
  1. 设置Key的有效时间
    命令格式 ```shell

    设置生效时长

    expire 数据名(key) 有效时间(单位为秒)

查看剩余有效时间,返回值为-2时,表示键被删除

ttl 数据名(key)

取消时长设置, key 存在但没有设置剩余生存时间时,返回 -1

persist 数据名(key)

  1. <br />示例:
  2. ```shell
  3. 127.0.0.1:6379> set bomb tnt
  4. OK
  5. 127.0.0.1:6379> expire bomb 10
  6. (integer) 1
  7. 127.0.0.1:6379> ttl bomb
  8. (integer) 5
  9. 127.0.0.1:6379> persist bomb
  10. (integer) 1
  11. 127.0.0.1:6379> ttl bomb
  12. (integer) -1

数据类型

Reids中基础数据结构包含字符串、散列,列表,集合,有序集合。工作中具体使用哪种类型要结合具体场景。

String类型

字符串类型是redis中最简单的数据类型,它存储的值可以是字符串,其最大字符串长度支持到512M。基于此类型,可以实现博客的字数统计,将日志不断追加到指定key,实现一个分布式自增id,实现一个博客的的点赞操作等

incr/incrby

当存储的字符串是整数时,redis提供了一个实用的命令INCR,其作用是让当前键值递增,并返回递增后的值。如果num不存在,则自动会创建,如果存在自动+1。

  1. #语法格式
  2. incr 数据名(key)
  3. #示例
  4. 127.0.0.1:6379> set num 1
  5. OK
  6. 127.0.0.1:6379> incr num
  7. (integer) 2
  8. 127.0.0.1:6379> incr num
  9. (integer) 3

指定增长系数

  1. #命令格式
  2. incrby key 系数
  3. #示例
  4. 127.0.0.1:6379> incrby num 2
  5. (integer) 5
  6. 127.0.0.1:6379> incrby num 2
  7. (integer) 7
  8. 127.0.0.1:6379> incrby num 2
  9. (integer) 9

decr/decrby

与incr相反,decr与decrby实现数据自减

  1. #命令格式
  2. decr key
  3. decrby key 系数
  4. #示例
  5. 127.0.0.1:6379> incr num
  6. (integer) 10
  7. 127.0.0.1:6379> decr num
  8. (integer) 9
  9. 127.0.0.1:6379> decrby num 3

append

append用于向尾部追加值,若键不存在会自动创建,其值为value,即相当于SET key value。返回值是追加后字符串的总长度。

  1. #命令格式
  2. append key value
  3. #示例
  4. 127.0.0.1:6379> get test
  5. "123"
  6. 127.0.0.1:6379> append test "abc"
  7. (integer) 6
  8. 127.0.0.1:6379> get test
  9. "123abc"

mget/mset

获取和设置多个键值

  1. #语法格式
  2. mget key1 key2 key3...
  3. mset key1 value1 key2 value2....
  4. #示例
  5. 127.0.0.1:6379> keys *
  6. 1) "sname"
  7. 2) "id"
  8. 3) "name"
  9. 4) "num"
  10. 127.0.0.1:6379> mget num name
  11. 1) "1"
  12. 2) "123abc"
  13. 127.0.0.1:6379> mset id 100 sname 123
  14. OK
  15. 127.0.0.1:6379> mget id sname
  16. 1) "100"
  17. 2) "123"

strlen

strlen可以获取字符串长度,并返回数据长度,若键不存在返回0,如果键值为空串,返回也是0.

  1. #语法格式
  2. strlen key
  3. #示例
  4. 127.0.0.1:6379> get test
  5. "123abc"
  6. 127.0.0.1:6379> strlen test
  7. (integer) 6
  8. 127.0.0.1:6379> strlen tnt
  9. (integer) 0
  10. 127.0.0.1:6379> set tnt ""
  11. OK
  12. 127.0.0.1:6379> strlen tnt
  13. (integer) 0

Hash类型

Hash类型即为散列类型,Redis散列类型相当于Java中的HashMap,实现原理跟HashMap一致,一般用于存储对象信息,存储了字段(field)和字段值的映射,一个散列类型可以包含最多232-1个字段。

hget/hset

HSET和HGET赋值和取值,HSET命令不区分插入和更新操作,当执行插入操作时HSET命令返回1,当执行更新操作时返回0。

  1. #命令格式
  2. HSET key field value......
  3. HGET key field......
  4. HGETALL key
  5. #示例
  6. 127.0.0.1:6379> HSET user id 100 name mazhao
  7. (integer) 2
  8. 127.0.0.1:6379> HGET user id
  9. "100"
  10. 127.0.0.1:6379> HGET user name
  11. "mazhao"
  12. 127.0.0.1:6379> HGETall user
  13. 1) "id"
  14. 2) "100"
  15. 3) "name"
  16. 4) "mazhao"

hincrby

自增操作

  1. #命令格式
  2. #示例
  3. hincrby article total -1

hmset/hmget

hmset和hmget可以设置对象的多个值和获取获取多个值

  1. #命令格式
  2. hmset key failed value failed value ....
  3. hmget key failed failed ....
  4. #示例:
  5. 127.0.0.1:6379> hmset person username tony age 18
  6. OK
  7. 127.0.0.1:6379> hmget person age username
  8. 1) "18"
  9. 2) "tony"
  10. 127.0.0.1:6379> hgetall person
  11. 1) "username"
  12. 2) "tony"
  13. 3) "age"
  14. 4) "18"

hexists

判断属性是否存在

  1. #命令格式
  2. hexists key failed
  3. #示例:
  4. 127.0.0.1:6379> hexists user username
  5. (integer) 1
  6. 127.0.0.1:6379> hexists person age
  7. (integer) 1

hdel

删除属性

  1. #命令格式
  2. hdel key failed
  3. #示例
  4. 127.0.0.1:6379> hdel user age
  5. (integer) 1
  6. 127.0.0.1:6379> hgetall user
  7. 1) "username"
  8. 2) "chen"
  9. 127.0.0.1:6379> hgetall person
  10. 1) "username"
  11. 2) "tony"
  12. 3) "age"
  13. 4) "18"

hkeys/hvals

只获取字段名key或者字段值value

  1. #命令格式
  2. hkeys key
  3. hvals key
  4. #示例
  5. 127.0.0.1:6379> hkeys person
  6. 1) "username"
  7. 2) "age"
  8. 127.0.0.1:6379> hvals person
  9. 1) "tony"
  10. 2) "18"

List类型

Redis的list类型相当于java中的LinkedList,其原理就就是一个双向链表。支持正向、反向查找和遍历等操作,插入删除速度比较快。经常用于实现热销榜,最新评论等的设计。

ipush

ipush在key对应的list的头部添加字符串元素

  1. #命令格式
  2. lpush key value
  3. #示例
  4. 127.0.0.1:6379> LPUSH str "world"
  5. (integer) 1
  6. 127.0.0.1:6379> LRANGE str 0 -1
  7. 1) "world"
  8. 127.0.0.1:6379> LPUSH str "hello"
  9. (integer) 2
  10. 127.0.0.1:6379> LRANGE str 0 -1
  11. 1) "hello"
  12. 2) "world"

其中Lrange 返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推

rpush

rpush可以在key对应的list的尾部添加字符串元素

  1. #命令格式
  2. rpush key value
  3. #示例
  4. 127.0.0.1:6379> rpush name abc
  5. (integer) 1
  6. 127.0.0.1:6379> lrange name 0 -1
  7. 1) "abc"
  8. 127.0.0.1:6379> rpush name def
  9. (integer) 2
  10. 127.0.0.1:6379> lrange name 0 -1
  11. 1) "abc"
  12. 2) "def"

del

删除指定key

  1. #命令格式
  2. del key
  3. #示例:
  4. 127.0.0.1:6379> del name
  5. (integer) 1
  6. 127.0.0.1:6379> lrange name 0 -1
  7. (empty array)

insert

在key对应list指定value之前或之后添加字符串元素

  1. #命令格式
  2. linsert key before value value
  3. linsert key after value value
  4. #示例
  5. 127.0.0.1:6379> LRANGE name 0 -1
  6. 1) "abc"
  7. 2) "def"
  8. 127.0.0.1:6379> linsert name before def 123
  9. (integer) 3
  10. 127.0.0.1:6379> linsert name after def 456
  11. (integer) 4
  12. 127.0.0.1:6379> LRANGE name 0 -1
  13. 1) "abc"
  14. 2) "123"
  15. 3) "def"
  16. 4) "456"

lset

设置list中指定下标的元素值,用于修改操作

  1. #命令格式
  2. lset key 下标 value
  3. #示例:
  4. 127.0.0.1:6379> LRANGE name 0 -1
  5. 1) "123"
  6. 2) "456"
  7. 3) "789"
  8. 127.0.0.1:6379> lset name 0 111
  9. OK
  10. 127.0.0.1:6379> LRANGE name 0 -1
  11. 1) "111"
  12. 2) "456"
  13. 3) "789"

lrem

从key对应list中删除指定数量的和value相同的元素,count>0时,按从头到尾的顺序删除

  1. #命令格式
  2. lrem key 指定数量 value
  3. #示例
  4. redis 127.0.0.1:6379> rpush mylist5 "hello"
  5. (integer) 1
  6. redis 127.0.0.1:6379> rpush mylist5 "hello"
  7. (integer) 2
  8. redis 127.0.0.1:6379> rpush mylist5 "foo"
  9. (integer) 3
  10. redis 127.0.0.1:6379> rpush mylist5 "hello"
  11. (integer) 4
  12. redis 127.0.0.1:6379> lrem mylist5 2 "hello"
  13. (integer) 2
  14. redis 127.0.0.1:6379> lrange mylist5 0 -1
  15. 1) "foo"
  16. 2) "hello"
  17. redis 127.0.0.1:6379>
  18. count<0时,按从尾到头的顺序删除
  19. redis 127.0.0.1:6379> rpush mylist6 "hello"
  20. (integer) 1
  21. redis 127.0.0.1:6379> rpush mylist6 "hello"
  22. (integer) 2
  23. redis 127.0.0.1:6379> rpush mylist6 "foo"
  24. (integer) 3
  25. redis 127.0.0.1:6379> rpush mylist6 "hello"
  26. (integer) 4
  27. redis 127.0.0.1:6379> lrem mylist6 -2 "hello"
  28. (integer) 2
  29. redis 127.0.0.1:6379> lrange mylist6 0 -1
  30. 1) "hello"
  31. 2) "foo"
  32. count=0时,删除全部
  33. redis 127.0.0.1:6379> rpush mylist7 "hello"
  34. (integer) 1
  35. redis 127.0.0.1:6379> rpush mylist7 "hello"
  36. (integer) 2
  37. redis 127.0.0.1:6379> rpush mylist7 "foo"
  38. (integer) 3
  39. redis 127.0.0.1:6379> rpush mylist7 "hello"
  40. (integer) 4
  41. redis 127.0.0.1:6379> lrem mylist7 0 "hello"
  42. (integer) 3
  43. redis 127.0.0.1:6379> lrange mylist7 0 -1
  44. 1) "foo"

ltrim

保留指定key 的值范围内的数据

  1. #命令格式
  2. ltrim key 起始位置 结束位置
  3. #示例
  4. redis 127.0.0.1:6379> rpush mylist8 "one"
  5. (integer) 1
  6. redis 127.0.0.1:6379> rpush mylist8 "two"
  7. (integer) 2
  8. redis 127.0.0.1:6379> rpush mylist8 "three"
  9. (integer) 3
  10. redis 127.0.0.1:6379> rpush mylist8 "four"
  11. (integer) 4
  12. redis 127.0.0.1:6379> ltrim mylist8 1 -1
  13. OK
  14. redis 127.0.0.1:6379> lrange mylist8 0 -1
  15. 1) "two"
  16. 2) "three"
  17. 3) "four"

lpop

从list的头部删除元素,并返回删除元素

  1. #命令格式
  2. lpop key
  3. #示例
  4. redis 127.0.0.1:6379> lrange mylist 0 -1
  5. 1) "hello"
  6. 2) "world"
  7. redis 127.0.0.1:6379> lpop mylist
  8. "hello"
  9. redis 127.0.0.1:6379> lrange mylist 0 -1
  10. 1) "world"

rpop

从list的尾部删除元素,并返回删除元素

  1. #命令格式
  2. rpop key
  3. #示例
  4. redis 127.0.0.1:6379> lrange mylist2 0 -1
  5. 1) "hello"
  6. 2) "world"
  7. redis 127.0.0.1:6379> rpop mylist2
  8. "world"
  9. redis 127.0.0.1:6379> lrange mylist2 0 -1
  10. 1) "hello"

llen

返回key对应list的长度

  1. #命令格式
  2. llen key
  3. #示例
  4. redis 127.0.0.1:6379> llen mylist5
  5. (integer) 2

lindex

返回名称为key的list中index位置的元素:

  1. #命令格式
  2. lindex key 起始位置 结束位置
  3. #示例
  4. redis 127.0.0.1:6379> lrange mylist5 0 -1
  5. 1) "three"
  6. 2) "foo"
  7. redis 127.0.0.1:6379> lindex mylist5 0
  8. "three"
  9. redis 127.0.0.1:6379> lindex mylist5 1
  10. "foo"

rpoplpush

从第一个list的尾部移除元素并添加到第二个list的头部,最后返回被移除的元素值,整个操作是原子的.如果第一个list是空或者不存在返回nil:

  1. #命令格式
  2. rpoplpush key1 key2
  3. #示例:
  4. 127.0.0.1:6379> LRANGE name 0 -1
  5. 1) "111"
  6. 2) "456"
  7. 3) "789"
  8. 127.0.0.1:6379> LRANGE age 0 -1
  9. 1) "aaa"
  10. 2) "bbb"
  11. 127.0.0.1:6379> RPOPLPUSH name age
  12. "789"
  13. 127.0.0.1:6379> LRANGE age 0 -1
  14. 1) "789"
  15. 2) "aaa"
  16. 3) "bbb"
  17. 127.0.0.1:6379> LRANGE name 0 -1
  18. 1) "111"
  19. 2) "456"

Set类型

Redis的Set类似Java中的HashSet,是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis中Set集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

sadd

添加元素,重复元素添加失败,返回0

  1. #命令格式
  2. sadd key value
  3. #示例
  4. 127.0.0.1:6379> sadd name 123
  5. (integer) 1
  6. 127.0.0.1:6379> sadd name 456
  7. (integer) 1
  8. 127.0.0.1:6379> sadd name 789
  9. (integer) 1
  10. 127.0.0.1:6379> sadd name 789
  11. (integer) 0
  12. 127.0.0.1:6379> SMEMBERS name
  13. 1) "123"
  14. 2) "456"
  15. 3) "789"

smembers用于获取set集合内容,命令格式为:smembers key

spop

移除并返回集合中的一个随机元素

  1. #命令格式
  2. spop key
  3. #示例:
  4. 127.0.0.1:6379> SMEMBERS name
  5. 1) "123"
  6. 2) "456"
  7. 3) "789"
  8. 127.0.0.1:6379> SPOP name
  9. "456"
  10. 127.0.0.1:6379> SPOP name
  11. "789"
  12. 127.0.0.1:6379> SMEMBERS name
  13. 1) "123"

scard

获取成员个数

  1. #命令格式
  2. scard key
  3. #示例
  4. 127.0.0.1:6379> SMEMBERS name
  5. 1) "123"
  6. 127.0.0.1:6379> SCARD name
  7. (integer) 1

smove

从一个set集合移动一个元素到另外一个集合

  1. #命令格式
  2. smove key1 key2 key1value
  3. #示例
  4. 127.0.0.1:6379> smembers internet
  5. 1) "amoeba"
  6. 2) "redis"
  7. 3) "nginx"
  8. 127.0.0.1:6379> smembers bigdata
  9. 1) "hadopp"
  10. 2) "spark"
  11. 3) "rabbitmq"
  12. 127.0.0.1:6379> smove bigdata internet rabbitmq
  13. (integer) 1
  14. 127.0.0.1:6379> smembers internet
  15. 1) "amoeba"
  16. 2) "redis"
  17. 3) "rabbitmq"
  18. 4) "nginx"
  19. 127.0.0.1:6379> smembers bigdata
  20. 1) "hadopp"
  21. 2) "spark"

sunion

去集合并集

  1. #命令格式
  2. sunion key1 key2
  3. #示例:
  4. 127.0.0.1:6379> smembers internet
  5. 1) "amoeba"
  6. 2) "redis"
  7. 3) "rabbitmq"
  8. 4) "nginx"
  9. 127.0.0.1:6379> smembers bigdata
  10. 1) "hadopp"
  11. 2) "spark"
  12. 127.0.0.1:6379> sunion internet bigdata
  13. 1) "redis"
  14. 2) "nginx"
  15. 3) "rabbitmq"
  16. 4) "amoeba"
  17. 5) "hadopp"
  18. 6) "spark"