第二个模块 Redis类型

第二部分 redis

Redis官网 https://redis.io
Redis 中国镜像
Redis中国用户组(CRUG) http://www.redis.cn/download.html
Redis 数据类型的应用场景

发现:当清空hash、list、set、zset的值时,会把与之对应的key释放!

redis类型

  1. string 字符串类型(一个键最多存储512M)

是最简单的类型,你可以理解成与 Memcached 是一模一样的类型,一个 key 对应一个
value,其上支持的操作与 Memcached 的操作类似,但它的功能更丰富

  1. SET:设置key对应值为value(会覆盖)
    语法: SET key value
set str1 'xdl'
  1. GET:根据KEY找到对应的值
    语法: GET key
get str1

注意:如果key不存在 返回nil

  1. MSET:一次设置多个键值对(会覆盖)
    语法:MSET key value [key value .......]
    说明:mset 键1 值1 键2 值2 ...
mset str4 'xdl' str5 'itxdl' str6 'xdlo2o'

注意:会覆盖

  1. MGET:一次得到多个键值
    语法: MGET key key
    说明: mget 键1 键2 键3
mget str4 str5 str6
  1. SETNX:只有KEY不存在的时候才能设置成功
    语法: SETNX key value
setnx str1 'hello'

说明:如果存在,返回 0;如果不存在,返回1
注意:不会覆盖

  1. MSETNX:一次设置多个key-value对
    语法: MSETNX key value [key value .....]
msetnx str10 'a' str11 'b' str12 'c'
msetnx str12 'd' str13 'e'

说明:返回0:创建失败;返回1:创建成功
注意:不会覆盖,只有所有的key都不存在的时候才会成功

  1. SETEX:设置一个KEY并且设置一个过期时间
    语法: SETEX key seconds value
    说明:setex 键 秒数 值
setex str8 30 'xdl'

注意:会覆盖

  1. PSETEX: 以毫秒为单位设置KEY的生存周期
    语法:PSEREX key milliseconds value
psetex set9 20000 'hello'
  1. TTL 查看键值生命周期。
    语法: ttl KEY
ttl str8
  1. GETSET:设置指定key的值,并返回旧值
    语法: GETSET key value
set str2 'itxdl'
getset str2 'xdl'

注意:当key不存在返回nil,但不影响执行

  1. SETRANGE:相当于字符串替换
    语法: SETRANGE key offset value
    说明:setrange 键 第几个字符开始 新值
SET str7 'hello'
SETRANGE str7 5 'xdl'
setrange str7 20 'test'

注意: 如果设置key原来的字符串的长度比偏移量小,就会以零字节(\x00)来填充

  1. GETRANGE:返回字符串中的一部分
    语法: GETRANGE key start end
    说明:getrange 键 从第几个开始 到第几个结束
getrange str1 0 0   #获取第一个字符
getrange str1 0 1   #获取前两个字符
getrange str1 0 -1  #获取所有字符
getrange str1 0 -2  #去掉最后一位
getrange str1 0 1000
getrange str1 -1 10 #返回空字符串
  1. INCR:对key中存储的数字加1
    语法: INCR key
    说明:只能针对数字
set nums 10
incr nums
incr total

注意:key如果不存在,则会先初始化为0,在进行INCR操作

  1. DECR:将key中存储的数字减1
    语法: DECR key
    说明:只能针对数字
set nums1 1
decr nums1

注意:key如果不存在,则会先初始化为0,在进行DECR操作

  1. INCRBY:将key中存储的数字加上指定增量
    语法: INCRBY key INCREMENT
set nums 10
incrby nums 5
incrby nums 1.5 #报错,只能是整数

说明:只能使用整数
注意:key如果不存在,则会先初始化为0,在进行INCRBY操作

  1. DECRBY:将key中存储的数值减指定值
    语法: DECRBY key decrement
set total 20
decrby total 5

说明:只能使用整数
注意:key如果不存在,则会先初始化为0,在进行DECRBY操作

  1. APPEND:通过APPEND将值追加到字符串末尾
    语法: APPEND key value
set str20 'xdl'
append str20 'o2o'
  1. STRLEN:获取key的字符串长度
    语法: STRLEN key
strlen str4
  1. DEL 删除键
    语法: DEL key
set test feng
del test
  1. INCRBYFLOAT:将key中存储的数字加上指定浮点数
    语法: INCRBYFLOAT key increment
set num 1
incrbyfloat num 2.1

注意: 2.6.5版本以下不存在该方法

  1. hash类型

Hash 是一个 string 类型的 field 和 value 的映射表.它的添加、删除操作都是 O(1)
(平均)。
hash 特别适合用于存储对象。相较于将对象的每个字段存成单个 string 类型。将一个对象存
储在 hash 类型中会占用更少的内存,并且可以更方便的存取整个对象。

  1. HSET:将哈希表中的key中的field设置成指定的value
    语法: HSET key field value
    说明: hset 键 字段 值
hset h1 username 'zhangsan'
hset h1 password '123'
hset h1 age '18'
注意:会覆盖原值
  1. HGET:返回哈希表key中给的field的值
    语法: HGET key field
    说明:hget 键 字段
hget h1 username
  hget h1 age
  ```

3. HSETNX:将hash表中的field设置成指定的值,只有field不存在才能成功,如果field存在,操作无效
  语法: `HSETNX  key field value`

hsetnx h1 aaa '20'
hsetnx h1 aaa '21'

  注意:如果存在返回0,如果不存在 ,返回1.

4. HMSET:通过多个 field value设置到hash表key中
  语法: `HMSET key  field1 value1 field2 value2  .....`

hmset h2 username 'lisi' age '20' password '456'

  说明:批量存值

5. HMGET:一次获得hash表key中多个field的值
语法: `HMGET key field field .....`

hmget h2 username age password
hmget h2 username age password aaa

  注意:如果hash表key中field不存在,返回nil

6. HLEN:返回hash表key中的field的数量
  语法: `HLEN key`

hlen h2

  说明:查看键中有多少个字段

7. HGETALL:返回hash表key中所有的field和value
语法: `HGETALL key`

HGETALL h2

  说明:查看键中所有字段 值

8. HKEYS:返回hash表key中的所有的field
  语法: `HKEYS key`
  ```
hkeys h2
说明:查看所有键
  1. HVALS:返回hash表key中所有的field的对应值
    语法: HVALS key
  hvals h2
说明:查看所有值
  1. HDEL:删除hash中key的指定field,可删除一个或多个
    语法: HDEL key field field .....
hdel h2 username
  hgetall h2
  ```

11. HINCRBY :给hash表key中的field做增量操作
  语法: `HINCRBY key field increment`
  ```
hset h3 age 20
  hincrby h3 age 5 #age递增5

注意: 没有递减,如果 field不存在则添加这个字段,然后incrby

  1. HINCRBYFLOAT:给hash表key中的field做增量浮点操作
    语法: HINCRBYFLOAT key field increment
hset h3 aaa '12.2'
hincrbyfloat h3 aaa 2.5
  1. HEXISTS:检测hash中key的field是否存在
    语法: HEXISTS key field
hexists h2 username
  hexists h2 aaa

说明:有返回1;没有返回0;

  1. list(双向列表) 类型

list 是一个链表结构,主要功能是 push、pop、获取一个范围的所有值等等,操作中 key 理
解为链表的名字。
Redis 的 list 类型其实就是一个每个子元素都是 string 类型的双向链表。链表的最大长度是(2
的 32 次方)。我们可以通过 push,pop 操作从链表的头部或者尾部添加删除元素。这使得 list
既可以用作栈,也可以用作队列。
有意思的是 list 的 pop 操作还有阻塞版本的,当我们[lr]pop 一个 list 对象时,如果 list 是空,
或者不存在,会立即返回 nil。但是阻塞版本的 b[lr]pop 可以则可以阻塞,当然可以加超时时
间,超时后也会返回 nil。为什么要阻塞版本的 pop 呢,主要是为了避免轮询。举个简单的
例子如果我们用 list 来实现一个工作队列。执行任务的 thread 可以调用阻塞版本的 pop 去获
取任务这样就可以避免轮询去检查是否有任务存在。当任务来时候工作线程可以立即返回,
也可以避免轮询带来的延迟。

  1. LPUSH:向列表左端添加元素
    语法: LPUSH key value value ....
    说明:lpush 键 值1 值2 ...
lpush list1 a b c
注意:值从右往左插入
  1. LPUSHX:向列表头部添加元素,只有key存在才添加
    语法: LPUSHX key value
lpushx list1 a
  1. RPUSH:向列表右端添加元素
    语法: RPUSH key value ....
rpush list1 d e
说明:值从左到右插入
  1. RPUSHX:向列表尾部添加元素,只有key存在才添加
    语法: RPUSHX key value
rpushx list1 b
  1. LRANGE:获取列表片段
    语法: LRANGE key start stop
lrange list1 0 -1 #查看列表中所有值
#列表中的下标,索引。从左到右。0 1 2 3 4。从右到左。-1 -2 -3 -4 -5
  1. LINDEX:获取指定索引元素上的值
    语法: LIDEX key index
```

lindex list1 -1


7. LINSERT 向列表中插入元素
  语法: `LINSERT key BEFORE|AFTER pivot value`
lpush list1 a b c d
linsert list1 before 2(值) 5(值)。说明:在某个值的前面插入
linsert list1 after 2(值) 5(值)。说明:在某个值的后面插入
注意:如果检索值有重复,则只对第一个生效!

8. LSET:设置指定元素的值
  语法: `LSET key index value`
lset list1 2 7 #下标为2,修改后的值为7

9. LREM:删除列表中的指定值
  语法:`LREM key count value`
  > count >0 :从列表头部开始,向尾部搜索,移除与value相等的元素,移除count个
  count <0 :从列表的尾部开始,向头部搜索,,移除与value相等的元素,移除count个
  count = 0:移除列表中所有与value相等的元素

    ```
  lpush list3 a b c d a e b d c b e d
  lrem list3 2 a
  lrem list3 -2 b
  lrem list3 0 d
    ```

10. LTRIM:只保留列表片段
  语法:`LTRIM key start stop`
ltrim list3 0 3
说明:保留start-stop(下标)的值,其余删除掉。

11. LPOP:将列表头部的元素弹出
  语法: LPOP key

lpop list1


12. RPOP:弹出列表尾部元素
  语法: RPOP key

rpop list1


13. LLEN:获取列表长度
  语法:`LLEN key`

llen list1


14. RPOPLPUSH:将元素从一个列表转移到另一个列表
  语法: `RPOPLPUSH  source destination`

lpush list5 a b c
lpush list6 x y z
rpoplpush list5 list6

注意:一次移动一个元素

4. **set(无序集合)**
>  set 是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合
求交并差等操作,操作中 key 理解为集合的名字。
Redis 的 set 是 string 类型的无序集合。
注意:集合中不能有重复值!添加的时候会把重复的值删除掉!

1. SADD:向集合中添加一个元素
  语法: `SADD key value [value2 ...]`

sadd s1 xdl
sadd s1 itxdl
sadd s1 1 2 3

  说明:创建集合并添加数值

2. SMEMBERS:查看集合中所有的元素
  语法: `SMEMBERS key`

smembers set1


3. SRANDMEMBER:随机返回集合中元素
  语法: `SRANDMEMBER key count`
  > 注意:
      count 为正数,而且小于集合中的元素,返回一个随机元素的集合数组,
      count 为正数,而且大于集合中的个数的时候,返回整个集合
      count 为负数,返回一个数组,数组中的成员可能出现重复,数组的长度是count的绝对值
  count 默认为1

    ```
    srandmember set1 #随机取出一个值
    srandmember set1 2 #随机取出二个值
    srandmember set1 -2 #随机取出二个值,可以重复出现
    ```

4. SPOP:删除并返回集合中的随机元素
  语法: `SPOP key`

spop set1

  说明:随机删除一个值

5. SREM:删除集合中一个或多个成员
  语法: `SREM key member [member ....]`
srem set1 xdl
  说明:删除指定的一个值

6. SCARD:返回集合中元素个数
  语法: `SCARD key`

scard set2


7. SINTER:返回集合的交集
  语法: `SINTER key key key ...`

sinter set2 set3
sadd set5 c
sinter set2 set3 set5


8. SINTERSTORE:将交集的结果保存到指定的集合当中
  语法: `SINTERSTORE destination key key  ....`

sinterstore set7 set2 set3

  说明:查看交集并保存到set7

9. SDIFF:返回集合的差集
  语法: `SDIFF key key ....`

sadd set2 a b c d
sadd set3 c d e f
sadd set4 a e
sdiff set3 set2 #求set3 与 set2 的差集,以set3为主数据
sdiff set3 set2 set4 #求set3 与 set2、set4 的差集,以set3为主数据

注意:返回的结果以第一个集合为主数据进行匹配返回!

10. SDIFFSTORE:将差集的结果保存到指定的集合当中
  语法: `SDIFFSTORE destination key key  ....`

sdiffstore set6 set2 set3

  说明:查看差集并保存到set6

11. SUNION:返回集合中并集
  语法: `SUNION key key ...`

sunion set2 set3
sunion set2 set3 set4

说明:将集合合并,如果有重复的数据只取一个

12. SUNIONSTORE:将并集的结果保存到指定的集合当中
  语法: `SUNIONSTORE destination key key  ....`

sunionstore set8 set2 set3

  说明:查看并集并保存到set8

13. SMOVE:将集合中的元素移动另一个集合中
  语法: `SMOVE source destination member`
smove s1 s2 5
  说明:移动s1里的5到s2中

14. SISMEMBER:检查member是否是集合中的成员
  语法: `SISMEMBER key member`
  ```
SISMEMBER set1 xdl

注意:在返回1;不在返回0;

  1. zset(有序集合)

    1. ZADD:将元素及其分数添加到集合中
      语法:ZADD key score member [score member]
      说明:zadd 键 分数 值 分数 值
ZADD zset 100 xdl
ZADD zset 98 zhangsan 98 list 80 test 78 test1 85 test2
ZADD zset  60 test2 67 test3 56 test4

注意:创建有序集合并添加元素。如果值重复,则覆盖,如果不重复,则添加

2. ZRANGE:按照元素分数从小到大的顺序返回指定索引start到stop之间所有元素(包含两端)

语法:ZRANGE key start stop [WITHSCORES]

ZRANGE zset 0 -1
ZRANGE zset  0 -1 WITHSCORES
ZRANGE zset  0 2 WITHSCORES
ZRANGE zset   0 2000 WITHSCORES
ZRANGE zset   1000 2000 WITHSCORES
ZADD zset   60 test6 60 test7 60 test8 60 test9

注意:当两个元素的分数相同的时候,Redis在排序按照字典的顺序(0<9<A<Z<a<z),如果使用的是UTF-8的编码方式的中文同样按照字典顺序排列

3. ZREVRANGE:和ZRANGE相反,按照分数从大到小的顺序

语法:ZREVRANGE key start stop [WITHSCORES]

ZREVRANGE zset   0 -1 WITHSCORES
4. ZRANGEBYSCORE:获得指定分数范围内的元素,按照分数从小到大的顺序,返回的是分数在指定的min到max的元素

语法:ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

#获得分数80~90之间的所有元素 包含80 90
ZRANGEBYSCORE zset   80 90
ZADD zset  81 test9 82 test10 83 test11 84 test12 84 test13 88 test14 89 test15 90 test16
ZRANGEBYSCORE zset  80 90 WITHSCORES
ZRANGEBYSCORE zset  80 (90 WITHSCORES
ZRANGEBYSCORE zset  (80 (90 WITHSCORES
RANGEBYSCORE zset  (80 (90 WITHSCORES  LIMIT 0 3

注意:通过(代表不包端点

5. ZREM:删除一个或者多个元素,返回删除元素的个数

语法:ZREM key member ...

ZREM zset   test16
6. ZINCRBY:操作某个元素的分数,返回操作之后的分数

语法:ZINCRBY key increment member

ZINCRBY zset  5 test16
ZINCRBY zset   -15 test16
说明:添加元素,如果不存在,添加成功,如果存在,添加不成功

7. ZRANK:获得指定元素的排名,根据分数从小到大的顺序

语法:ZRANK key member

ZRANK zset xdl
ZRANGE zset    0 -1 WITHSCORES
  说明:查看指定值的下标。从0 开始

8. ZSCORE:获得指定元素的分数

语法:ZSCORE key member

ZSCORE zset  xdl
ZADD zset 12.3 test5
9. ZREVRANK:获得指定元素的排名,根据分数从大到小的顺序

语法:ZREVRANK key member

ZREVRANK zset xdl
ZREVRANGE zset  0 -1 WITHSCORES
zrevrank z1 lyx
说明:查看指定元素的下标。倒着从0开始

10. ZREVRANGEBYSCORE :获得指定分数范围内的元素,按照元素的分数从大到小的顺序返回min和max之间的元素

语法:ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

ZREVRANGEBYSCORE zset  90 80 WITHSCORES
11. ZCARD:获得集合中元素的数量

语法:ZCARD key

ZCARD zset
12. ZCONUT:获得指定分数内的元素的数量

语法:ZCOUNT key min max

ZCOUNT zset   80 90
COUNT zset   (80 (90
13. ZREMRANGEBYRANK:按照排名范围删除元素,按照分数从小到大的顺序删除所指定的排名范围内的所有元素

语法:ZREMRANGEBYRANK key start stop

ZADD testRem 1 a 2 b 3 c 4 d 5 e 6 f 7 g 8 h
ZREMRANGEBYRANK testRem 0 2
ZRANGE testRem  0 -1 WITHSCORES
说明:根据下标来删除指定范围内的元素

14. ZREMRANGEBYSCORE:按照分数范围删除元素

语法:ZREMRANGEBYSCORE key min max

ZADD testRem1 1 a 2 b 3 c 4 d 5 e 6 f 7 g 8 h
ZREMRANGEBYSCORE testRem1 3 7
ZRANGE testRem1   0 -1 WITHSCORES
说明:根据分数来删除指定范围内的元素

15. ZINTERSTORE:计算有序集合的交集,并将结果保存起来

语法:ZINTERSTORE destination numkeys [WEIGHTS weight weight...] [AGGREGATE SUM | MIN | MAX]

ZADD zset2 1 a 2 b 3 c
ZADD zset3 10 a 20 b 30 c
ZINTERSTORE zset4 2  zset2  zset3
ZREVRANGE zset5   0 -1 WITHSCORES
ZINTERSTORE zset4 2  zset2  zset3  AGGREGATE SUM
ZINTERSTORE zset5 2  zset2  zset3  AGGREGATE MIN
ZINTERSTORE zset6 2  zset2  zset3 AGGREGATE MAX
ZINTERSTORE zset7 2  zset2  zset3  WEIGHTS 2 0.2
说明:查看交集并保存到新的集合。zinterstore 新集合 集合数目 集合1 集合2 集合3

16. ZUNIONSTORE:计算有序集合并集,将结果保存起来

语法:ZUNIONSTORE destination numkeys key key ... [WEIGHTS weight weight...] [AGGREGATE SUM | MIN | MAX]

ZADD zset8 1 a 2 b 3 c
ZADD zset9 4 d 5 e 6 f 7 a
ZUNIONSTORE zset10 2   zset8 zset9
ZRANGE  zset10 0 -1 WITHSCORES
ZUNIONSTORE zset11 2 zset8 zset9 AGGREGATE SUM
ZRANGE  zset11 0 -1 WITHSCORES
ZUNIONSTORE zset12 2  zset8 zset9 AGGREGATE MIN
ZRANGE  zset12 0 -1 WITHSCORES
ZUNIONSTORE zset13 2  zset8 zset9 AGGREGATE MAX
ZRANGE  zset13 0 -1 WITHSCORES
ZUNIONSTORE zset14 2  zset8 zset9 WEIGHTS 2 2
ZRANGE  zset14 0 -1 WITHSCORES

推荐阅读更多精彩内容