博客
关于我
Redis支持的5种数据类型
阅读量:301 次
发布时间:2019-03-03

本文共 8231 字,大约阅读时间需要 27 分钟。

概述

Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。

Redis 支持很多特性,例如将内存中的数据持久化到硬盘中,使用复制来扩展读性能,使用分片来扩展写性能。

数据类型

在这里插入图片描述

在启动时,可以通过“redis-cli -n 1”指定启动那个数据库。

一、String

1.get 、set:

127.0.0.1:6379> set k1 abcOK127.0.0.1:6379> get k1"abc"

2.列出所有的键:

127.0.0.1:6379> keys *1) "hello"2) "k1"

3.SETNX:

not exist只有在key不存在的时候才允许创建

127.0.0.1:6379> SETNX k1 www(integer) 0127.0.0.1:6379> get k1"abc"

4. xx:

只有存在的时候,才能设置

127.0.0.1:6379> set k1 www xxOK127.0.0.1:6379> get k1"www"

5.记录value原始类型:

127.0.0.1:6379> get k2"99"127.0.0.1:6379> OBJECT encoding k2"int"

6.MSET设置多个键值:

127.0.0.1:6379> MSET k3 3 k4 4 OK127.0.0.1:6379> keys *1) "k3"2) "k4"3) "k1"4) "hello"5) "k2"

7.MSETNX:

键不存在的时候,设置多个键值

127.0.0.1:6379> MSETNX k3 3 k4 4(integer) 0

8.keys ?

查找命令

127.0.0.1:6379> keys ?(empty list or set)127.0.0.1:6379> keys ??1) "k3"2) "k4"3) "k1"4) "k2"

9.键类型:

127.0.0.1:6379> type k3string

10.长度:

127.0.0.1:6379> STRLEN k3(integer) 1

11.FLUSHALL:

把所有的数据库全部清掉

127.0.0.1:6379> FLUSHALLOK127.0.0.1:6379> keys *(empty list or set)

12.FLUSHDB:

只清除掉当前的数据库,一个6379端口最多可以有16个数据库

127.0.0.1:6379> keys *1) "k"127.0.0.1:6379> FLUSHDBOK

13.键是否存在:

127.0.0.1:6379> EXISTS k(integer) 0

14.返回旧值并设置新值:

127.0.0.1:6379> set k 1OK127.0.0.1:6379> get k"1"127.0.0.1:6379> GETSET k 2"1"127.0.0.1:6379> get k"2"

15.MGET:

获取多个给定的键的值

127.0.0.1:6379> MGET k k11) "2"2) "k1"

16.append追加:

127.0.0.1:6379> APPEND k www(integer) 4127.0.0.1:6379> get k"2www"

17.获取子字符串:

127.0.0.1:6379> get k"2www"127.0.0.1:6379> GETRANGE k 0 2"2ww"

18.步长1的增减:

127.0.0.1:6379> set k1 99OK127.0.0.1:6379> INCR k1(integer) 100127.0.0.1:6379> INCR k1(integer) 101127.0.0.1:6379> INCR k1(integer) 102

19.指定数值增长:

127.0.0.1:6379> INCRBY k1 2(integer) 104127.0.0.1:6379> INCRBY k1 2(integer) 106
127.0.0.1:6379> INCRBYFLOAT k1  1.5"107.5"127.0.0.1:6379> INCRBYFLOAT k1  1.5"109"

20.设置比特位

前面偏移量,后面值

127.0.0.1:6379> SETBIT k2 1 1(integer) 0127.0.0.1:6379> get k2"@"

21.获取某一位上的值:

127.0.0.1:6379> SETBIT k 9 1(integer) 0127.0.0.1:6379> get k"@@"127.0.0.1:6379> GETBIT k 9(integer) 1

22.位操作:

进行的是与运算

127.0.0.1:6379> SETBIT k1 1 1(integer) 0127.0.0.1:6379> SETBIT k2 7 1(integer) 0127.0.0.1:6379> BITOP and k3 k1 k2(integer) 1127.0.0.1:6379> get k3"\x00"127.0.0.1:6379> BITOP or k4 k1 k2(integer) 1127.0.0.1:6379> get k4"A"

二、列表

  • 基于Linked List实现
  • 元素是字符串类型
  • 列表头尾增删快,中间增删慢,增删元素是常态
  • 元素可以重复出现
  • 最多包含2^32-1元素

1.先推再查:

127.0.0.1:6379> LPUSH l1 a(integer) 1127.0.0.1:6379> LPUSH l1 b c d e f g(integer) 7127.0.0.1:6379> LRANGE l1 0 -11) "g"2) "f"3) "e"4) "d"5) "c"6) "b"7) "a"

2.从左侧:

127.0.0.1:6379> LPOP l1"g"127.0.0.1:6379> LPOP l1"f"127.0.0.1:6379> LPOP l1"e"127.0.0.1:6379> LPOP l1"d"

3.从右侧:

127.0.0.1:6379> RPOP l1"a"127.0.0.1:6379> RPOP l1"b"127.0.0.1:6379> RPOP l1"c"

4.从一个列表尾部弹出元素压入到另一个列表的头部:

127.0.0.1:6379> LPUSH l1 b c d e f(integer) 5127.0.0.1:6379> RPOPLPUSH l1 l2"b"127.0.0.1:6379> LRANGE l1 0 -11) "f"2) "e"3) "d"4) "c"

5.获取指定位置的元素:

1) "f"2) "e"3) "d"4) "c"127.0.0.1:6379> LINDEX l1 2"d"

6.设置指定位置上元素的值:

127.0.0.1:6379> LSET l1 0 aOK127.0.0.1:6379> LRANGE l1 0 -11) "a"2) "e"3) "d"4) "c"

7.从列表头部开始删除值等于value的元素count次,LIST 可以重复出现:

LREM listkey -1 ab就是倒着删,如果是0就全都删了

127.0.0.1:6379> RPUSH listkey c abc c ab 123 ab bj ab redis list(integer) 10127.0.0.1:6379> LRANGE listkey 0 -1 1) "c" 2) "abc" 3) "c" 4) "ab" 5) "123" 6) "ab" 7) "bj" 8) "ab" 9) "redis"10) "list"127.0.0.1:6379> LREM listkey 2 ab(integer) 2127.0.0.1:6379> LRANGE listkey 0 -11) "c"2) "abc"3) "c"4) "123"5) "bj"6) "ab"7) "redis"8) "list"

8.去除指定范围 外 元素:

(integer) 10127.0.0.1:6379> LTRIM listkey 0 0OK127.0.0.1:6379> LRANGE listkey 0 -11) "c"

9.在列表中某个存在的值前后插入元素:

127.0.0.1:6379> LPUSH l3 a b d(integer) 3127.0.0.1:6379> LRANGE l3 0 -11) "d"2) "b"3) "a"127.0.0.1:6379> LINSERT l3 before b x(integer) 4127.0.0.1:6379> LRANGE l3 0 -11) "d"2) "x"3) "b"4) "a"127.0.0.1:6379> LINSERT l3 after b s(integer) 5127.0.0.1:6379> LRANGE l3 0 -11) "d"2) "x"3) "b"4) "s"5) "a"

10阻塞:

如果弹出的列表不存在或者为空,就会阻塞

超时时间设置为0,就是永久阻塞,直到有数据可以弹出
如果多个客户端阻塞在同一个列表上,使用First In First Service原则,先到先服务

127.0.0.1:6379> BLPOP l1 01) "l1"2) "1"(23.62s)

BLPOP l1 0中的0表示进入无限的时间等待状态,5表示5s后解除阻塞

127.0.0.1:6379> BLPOP l1 5(nil)(5.32s)

三、hash散列

  • 由field和关联的value组成的map键值对
  • field和value是字符串类型
  • 一个hash中最多包含2^32-1键值对
    在这里插入图片描述1.设置字段:
    HSET设置单个字段,HMSET设置多个字段(如果不用HSET,可以set k1: name husky)
127.0.0.1:6379> HSET k1 f1 v1(integer) 1127.0.0.1:6379> HSET k1 name husky(integer) 1127.0.0.1:6379> HSET k1 age 10(integer) 1127.0.0.1:6379> HMSET k1 sex m  name GOK

2.获取value:

127.0.0.1:6379> HVALS k11) "v1"2) "G"3) "10"4) "m"

3.拿到所有的field:

127.0.0.1:6379> HKEYS k11) "f1"2) "name"3) "age"4) "sex"

4.返回字段个数:

127.0.0.1:6379> HMSET k1 name hushy age 1OK127.0.0.1:6379> HKEYS k11) "name"2) "age"127.0.0.1:6379> HLEN k1(integer) 2

5.判断字段是否存在:

key或field不存在,返回0

127.0.0.1:6379> HEXISTS k1 name(integer) 1127.0.0.1:6379> HEXISTS k1 sex(integer) 0

6.返回所有键值对:

127.0.0.1:6379> HGETALL k11) "name"2) "hushy"3) "age"4) "1"

7.在字段对应的值上进行增量运算:

127.0.0.1:6379> HINCRBY k1 age 9(integer) 10127.0.0.1:6379> HINCRBYFLOAT k1 age 0.5"10.5"

Hash用途:

  • 1.节约内存空间
  • 2.每创建一个键,它都会为这个键储存一些附加的管理信息(比如这个键的类型,这个键最后一次被访问的时间等等)
  • 3.所以数据库里面的键越多,redis数据库服务器在储存附加管理信息方面耗费的内存就越多,花在管理数据库键上的CPU也会越多在字段对应的值上进行浮点数的增量计算

不适合hash的情况:

  • 1.使用二进制位操作命令:因为Redis目前支持对字符串键进行SETBIT、GETBIT、BITOP等操作,如果你想使用这些操作,那么只能使用字符串键,虽然散列也能保存二进制数据
  • 2.使用过期键功能:Redis的键过期功能目前只能对键进行过期操作,而不能对散列的字段进行过期操作,因此如果你要对键值对数据使用过期功能的话,那么只能把键值对储存在字符串里面

四、set集合

  • 无序的、去重的
  • 元素是字符串类型
  • 最多包含2^32-1元素

1.添加一个或多个元素:

127.0.0.1:6379> SADD s1 mike marie peter ben marry(integer) 5127.0.0.1:6379> SMEMBERS s11) "ben"2) "marie"3) "mike"4) "peter"5) "marry"

2.移除一个或多个元素:

SREM s1  benSREM s1 ben  mike

3.返回集合包含的所有元素:

SMEMBERS  s1

4.检查给定的元素是否存在在集合中:

127.0.0.1:6379> SISMEMBER s1 ben(integer) 1

5.随机返回集合中指定个数的元素:

  • 1.如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合 最多返回整个集合 conut>=0
  • 2.如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值 count < 0 长度为count绝对值,元素可能重复
  • 3.如果 count 为 0,返回空
  • 4.如果 count 不指定,随机返回一个元素
127.0.0.1:6379> SRANDMEMBER s1 -31) "marie"2) "mike"3) "mike"127.0.0.1:6379> SRANDMEMBER s1 41) "peter"2) "marie"3) "ben"4) "mike"127.0.0.1:6379> SRANDMEMBER s1 0(empty list or set)127.0.0.1:6379> SRANDMEMBER s1 "mike"

6.随机弹出一个值:

127.0.0.1:6379> SPOP s1"peter"127.0.0.1:6379> SMEMBERS s11) "marie"2) "ben"3) "marry"4) "mike"

7.返回元素个数:

127.0.0.1:6379> SCARD s1(integer) 4

8.差集

在这里插入图片描述

127.0.0.1:6379> SADD s1 1 2 3 4 5(integer) 5127.0.0.1:6379> SADD s2 1 2 3 9 8(integer) 5127.0.0.1:6379> SDIFFSTORE s3 s1 s2(integer) 2127.0.0.1:6379> SMEMBERS s31) "4"2) "5"

9.交集:

在这里插入图片描述

127.0.0.1:6379> SINTER s1 s21) "1"2) "2"3) "3"

五、SortedSet有序集合

  • 类似Set集合
  • 有序的、去重的
  • 元素是字符串类型
  • 每一个元素都关联着一个浮点数分值(Score),并按照分值从小到大的顺序排列集合中的元素。分值可以相同
  • 最多包含2^32-1元素

1.添加

127.0.0.1:6379> ZADD fruits 3.2 香蕉(integer) 1127.0.0.1:6379> ZADD fruits 2.0 西瓜(integer) 1127.0.0.1:6379> ZADD fruits 4.0 番石榴 7.0 梨 6.8 芒果(integer) 3127.0.0.1:6379> quit[root@node1 ~]# redis-cli --raw127.0.0.1:6379> ZRANGE fruits 0 -1西瓜香蕉番石榴芒果梨

2.从小到大

127.0.0.1:6379> ZRANGE fruits 0 -1 withscores西瓜2香蕉3.2000000000000002番石榴4芒果6.7999999999999998梨7

3.从大到小

127.0.0.1:6379> ZREVRANGE fruits 0 -1 withscores梨7芒果6.7999999999999998番石榴4香蕉3.2000000000000002西瓜2

4.移除一个或多个元素

127.0.0.1:6379> ZREM fruits 2.0 西瓜1127.0.0.1:6379> ZRANGE fruits 0 -1香蕉番石榴芒果梨

5.增减分值:

127.0.0.1:6379> ZINCRBY fruits 1.5 香蕉4.7000000000000002

6.返回元素排名:

127.0.0.1:6379> ZRANK fruits 香蕉1

7.返回指定区间范围内的元素:

127.0.0.1:6379> ZRANGE fruits 2 4 withscores芒果6.7999999999999998梨7

8.返回指定分值范围内的元素:

127.0.0.1:6379> ZRANGEBYSCORE fruits 3  5.5 withscores番石榴4香蕉4.7000000000000002

9.移除指定排名的元素:

127.0.0.1:6379> ZREMRANGEBYRANK fruits 1 22127.0.0.1:6379> ZRANGE fruits 0 -1番石榴梨

10.移除指定分值范围内的元素:

127.0.0.1:6379> ZREMRANGEBYSCORE fruits 3 5 1127.0.0.1:6379> ZRANGE fruits 0 -1 withscores梨7

11.返回集合元素个数:

127.0.0.1:6379> ZCARD fruits1

12.返回指定范围内元素个数:

127.0.0.1:6379> ZCOUNT fruits 0 00127.0.0.1:6379> ZCOUNT fruits 0 71127.0.0.1:6379> ZCOUNT fruits (7 90

13.并集

和ZUNIONSTORE scores-all1 2 scores1 scores2 AGGREGATE SUM效果一样

127.0.0.1:6379> ZADD scores1 70 tom 80 peter 60 john3127.0.0.1:6379> ZADD scores2 90 peter 60 ben2127.0.0.1:6379> ZUNIONSTORE scores3 2 scores1 scores24127.0.0.1:6379> ZRANGE scores3 0 -1 withscoresben60john60tom70peter170
127.0.0.1:6379> ZUNIONSTORE scores-all3 2 scores1 scores2 WEIGHTS 1 0.5 AGGREGATE SUM4127.0.0.1:6379> ZRANGE scores-all3 0 -1 withscoresben30john60tom70peter125

转载地址:http://tpbq.baihongyu.com/

你可能感兴趣的文章
PYTHON UDP只能接收本地报文,无法接收其他主机通过路由器发过来的报文
查看>>
QLabel控件功能示例
查看>>
Python对象和引用计数 object.h文档
查看>>
springcloud学习:rpc和http的区别,各自的优缺点
查看>>
java进程、线程知识扩充
查看>>
vue项目中报/sockjs-node/info错误
查看>>
如何处理前任程序员留下的代码
查看>>
来自投资银行的20个Java面试题
查看>>
20个非常有用的Java程序片段
查看>>
Dubbo架构设计详解
查看>>
如何锻炼JAVA编程思路?
查看>>
Mybatis源码分析(四):属性接口之objectFactory
查看>>
全面了解 Nginx 主要应用场景
查看>>
【系统日志】log4j配置学习总结
查看>>
2019年1月已到,Java 8 要收费了吗?
查看>>
最全的spring面试题和答案
查看>>
CentOS 8 已下载ntpdate 却无法使用crond进行时间同步
查看>>
坑啊,Spring的BeanUtils是这样用的,为啥会出bug?
查看>>
Mybatis的这些坑!把我坑惨了!
查看>>
在 IntelliJ IDEA 中使用 Git,太方便了!
查看>>