精华内容
下载资源
问答
  • Redis 支持五种数据类型:string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(sorted set:有序集合)。 应用场景 string(字符串) 1. string 通常用于保存单个字符串或Json字符串数据; 2. string 是二...

    Redis数据类型

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

    应用场景

    string(字符串)

    1. string 通常用于保存单个字符串或Json字符串数据;
    2. string 是二进制安全的,可以将图片文件的内容作为字符串进行存储;
    3. 计数器(可用于计数、微博数、粉丝数、点击量等);
    

    hash(哈希)

    常用于存储一个对象。
    

    list(列表)

    1. 对数据量大的集合数据进行删减,譬如:粉丝列表、留言评论等还可以进行分页;
    2. 任务队列;
    

    set(集合)

    常用于两个集合间的数据计算,交集、并集、差集等。
    

    zset(有序集合)

     常用于排行榜、积分榜等。
    
    展开全文
  • String 1、String 常用命令: 除了get、set、incr、decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容...应用场景: String是最常用种数据类型,普通key/value存储
    String
    1. 1、String  
    2. 常用命令:  
    3. 除了get、set、incr、decr mget等操作外,Redis还提供了下面一些操作:  
    4. 获取字符串长度  
    5. 往字符串append内容  
    6. 设置和获取字符串的某一段内容  
    7. 设置及获取字符串的某一位(bit)  
    8. 批量设置一系列字符串的内容  
    9.   
    10. 应用场景:  
    11. String是最常用的一种数据类型,普通的key/value存储都可以归为此类,value其实不仅是String,  
    12. 也可以是数字:比如想知道什么时候封锁一个IP地址(访问超过几次)。INCRBY命令让这些变得很容易,通过原子递增保持计数。  
    13.   
    14. 实现方式:  
    15. m,decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。  

    Hash

    1. 常用命令:  
    2. hget,hset,hgetall 等。  
    3. 应用场景:  
    4. 我们简单举个实例来描述下Hash的应用场景,比如我们要存储一个用户信息对象数据,包含以下信息:  
    5.            用户ID,为查找的key,  
    6.            存储的value用户对象包含姓名name,年龄age,生日birthday 等信息,  
    7.    如果用普通的key/value结构来存储,主要有以下2种存储方式:  
    8.        第一种方式将用户ID作为查找key,把其他信息封装成一个对象以序列化的方式存储,  
    9.            如:set u001 "李三,18,20010101"  
    10.            这种方式的缺点是,增加了序列化/反序列化的开销,并且在需要修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发进行保护,引入CAS等复杂问题。  
    11.        第二种方法是这个用户信息对象有多少成员就存成多少个key-value对儿,用用户ID+对应属性的名称作为唯一标识来取得对应属性的值,  
    12.            如:mset user:001:name "李三 "user:001:age18 user:001:birthday "20010101"  
    13.            虽然省去了序列化开销和并发问题,但是用户ID为重复存储,如果存在大量这样的数据,内存浪费还是非常可观的。  
    14.     那么Redis提供的Hash很好的解决了这个问题,Redis的Hash实际是内部存储的Value为一个HashMap,  
    15.     并提供了直接存取这个Map成员的接口,  
    16.         如:hmset user:001 name "李三" age 18 birthday "20010101"     
    17.             也就是说,Key仍然是用户ID,value是一个Map,这个Map的key是成员的属性名,value是属性值,  
    18.             这样对数据的修改和存取都可以直接通过其内部Map的Key(Redis里称内部Map的key为field), 也就是通过   
    19.             key(用户ID) + field(属性标签) 操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题。很好的解决了问题。  
    20.   
    21.           这里同时需要注意,Redis提供了接口(hgetall)可以直接取到全部的属性数据,但是如果内部Map的成员很多,那么涉及到遍历整个内部Map的操作,由于Redis单线程模型的缘故,这个遍历操作可能会比较耗时,而另其它客户端的请求完全不响应,这点需要格外注意。  
    22.   实现方式:  
    23.     上面已经说到Redis Hash对应Value内部实际就是一个HashMap,实际这里会有2种不同实现,这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为 zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。  

    List

    1. 常用命令:  
    2.     lpush,rpush,lpop,rpop,lrange,BLPOP(阻塞版)等。  
    3.   
    4. 应用场景:  
    5.     Redis list的应用场景非常多,也是Redis最重要的数据结构之一。  
    6.     我们可以轻松地实现最新消息排行等功能。  
    7.     Lists的另一个应用就是消息队列,可以利用Lists的PUSH操作,将任务存在Lists中,然后工作线程再用POP操作将任务取出进行执行。  
    8.   
    9. 实现方式:  
    10.     Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。  
    11.   
    12. RPOPLPUSH source destination  
    13.   
    14.     命令 RPOPLPUSH 在一个原子时间内,执行以下两个动作:  
    15.     将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。  
    16.     将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。  
    17.     如果 source 和 destination 相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊情况视作列表的旋转(rotation)操作。  
    18.     一个典型的例子就是服务器的监控程序:它们需要在尽可能短的时间内,并行地检查一组网站,确保它们的可访问性。  
    19.     redis.lpush "downstream_ips", "192.168.0.10"  
    20.     redis.lpush "downstream_ips", "192.168.0.11"  
    21.     redis.lpush "downstream_ips", "192.168.0.12"  
    22.     redis.lpush "downstream_ips", "192.168.0.13"  
    23.     Then:  
    24.     next_ip = redis.rpoplpush "downstream_ips", "downstream_ips"  
    25.   
    26. BLPOP  
    27.   
    28.   假设现在有 job 、 command 和 request 三个列表,其中 job 不存在, command 和 request 都持有非空列表。考虑以下命令:  
    29.   BLPOP job command request 30  #阻塞30秒,0的话就是无限期阻塞,job列表为空,被跳过,紧接着command 列表的第一个元素被弹出。  
    30.   1) "command"                             # 弹出元素所属的列表  
    31.   2) "update system..."                    # 弹出元素所属的值   
    32.   为什么要阻塞版本的pop呢,主要是为了避免轮询。举个简单的例子如果我们用list来实现一个工作队列。执行任务的thread可以调用阻塞版本的pop 去获取任务这样就可以避免轮询去检查是否有任务存在。当任务来时候工作线程可以立即返回,也可以避免轮询带来的延迟。  

    Set

    1. 4、Set  
    2.   
    3. 常用命令:  
    4.     sadd,srem,spop,sdiff ,smembers,sunion 等。  
    5.   
    6. 应用场景:  
    7.     Redis set 对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。  
    8.     比如在微博应用中,每个人的好友存在一个集合(set)中,这样求两个人的共同好友的操作,可能就只需要用求交集命令即可。  
    9.     Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实  
    10.   
    11. 实现方式:  
    12.     set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。  


    Sort Set

    1. 5、Sorted set  
    2.   
    3.   常用命令:  
    4.     zadd,zrange,zrem,zcard等  
    5.   
    6.   使用场景:  
    7.     以某个条件为权重,比如按顶的次数排序.  
    8.     ZREVRANGE命令可以用来按照得分来获取前100名的用户,ZRANK可以用来获取用户排名,非常直接而且操作容易。  
    9.     Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。  
    10.     比如:twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。  
    11.     比如:全班同学成绩的SortedSets,value可以是同学的学号,而score就可以是其考试得分,这样数据插入集合的,就已经进行了天然的排序。  
    12.     另外还可以用Sorted Sets来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。  
    13.   
    14.     需要精准设定过期时间的应用  
    15.     比如你可以把上面说到的sorted set的score值设置成过期时间的时间戳,那么就可以简单地通过过期时间排序,定时清除过期数据了,不仅是清除 Redis中的过期数据,你完全可以把Redis里这个过期时间当成是对数据库中数据的索引,用Redis来找出哪些数据需要过期删除,然后再精准地从数据库中删除相应的记录。  
    16.   
    17.   
    18.   实现方式:  
    19.     Redis sorted set 的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。  


    消息订阅

    1.    6、 Pub/Sub  
    2.   
    3.     Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个key值进行消息发布及消息订阅,  
    4.     当一个key值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。这一功能最明显的用法就是用作实时消息系统,比如普通的即时聊天,群聊等功能。  
    5.   
    6. 客户端1:subscribe  rain  
    7. 客户端2:PUBLISH  rain "my love!!!"  
    8.     (integer) 2 代表有几个客户端订阅了这个消息  

    transaction

    1.   7、Transactions  
    2.   
    3.     谁说NoSQL都不支持事务,虽然Redis的Transactions提供的并不是严格的ACID的事务(比如一串用EXEC提交执行的命令,在执行中服务器宕机,那么会有一部分命令执行了,剩下的没执行),但是这个Transactions还是提供了基本的命令打包执行的功能(在服务器不出问题的情况下,可以保证一连串的命令是顺序在一起执行的,中间有会有其它客户端命令插进来执行)。  
    4.     Redis还提供了一个Watch功能,你可以对一个key进行Watch,然后再执行Transactions,在这过程中,如果这个Watched的值进行了修改,那么这个Transactions会发现并拒绝执行。  
    5. Session 1  
    6.     (1)第1步  
    7.     redis 127.0.0.1:6379> get age  
    8.     "10"  
    9.     redis 127.0.0.1:6379> watch age  
    10.     OK  
    11.     redis 127.0.0.1:6379> multi  
    12.     OK  
    13.     redis 127.0.0.1:6379>  
    14.    
    15. Session 2  
    16.     (2)第2步  
    17.     redis 127.0.0.1:6379> set age 30  
    18.     OK  
    19.     redis 127.0.0.1:6379> get age  
    20.     "30"  
    21.     redis 127.0.0.1:6379>  
    22.   
    23. Session 1     
    24.     (3)第3步  
    25.     redis 127.0.0.1:6379> set age 20  
    26.     QUEUED  
    27.     redis 127.0.0.1:6379> exec  
    28.     (nil)  
    29.     redis 127.0.0.1:6379> get age  
    30.     "30"  
    31.     redis 127.0.0.1:6379>  
    32.   
    33.     第一步,Session 1 还没有来得及对age的值进行修改  
    34.   第二步,Session 2 已经将age的值设为30  
    35.   第三步,Session 1 希望将age的值设为20,但结果一执行返回是nil,说明执行失败,之后我们再取一下age的值是30,这是由于Session   1中对age加了乐观锁导致的。  


    展开全文
  • Redis除了可以存储键还可以存储常见的5种数据类型,分别是:String、List、Set、Hash、ZSet。对于Redis的命令有一部分是可以公用的,但是还有一些其他的命令是属于特殊使用的。 首先看看一张关于Redis的5种数据结构...

    1.前言

    Redis除了可以存储键还可以存储常见的5种数据类型,分别是:String、ListSetHashZSet。对于Redis的命令有一部分是可以公用的,但是还有一些其他的命令是属于特殊使用的。

    首先看看一张关于Redis的5种数据结构的对比:
    在这里插入图片描述

    2.String字符串类型

    Redis中的String类型就是一个由字节组成的序列,他和其他编程语言或者其他键值对存储提供的字符串操作非常相似。

    一个String类型的实例,其中键为hello,值为world:
    在这里插入图片描述
    (1)常用命令如下:
    在这里插入图片描述
    (2)Redis中的自增命令和自减命令:
    在这里插入图片描述
    (3)除了getsetdel、自增、自减等操作外,Redis还提供了下面一些操作:

    1、获取字符串长度
    2、往字符串append内容
    3、设置和获取字符串的某一段内容
    4、设置及获取字符串的某一位(bit)
    5、批量设置一系列字符串的内容
    

    如下图所示:
    在这里插入图片描述
    (4)应用场景:

    String是最常用的一种数据类型,普通的key/value存储都可以归为此类,value其实不仅是String, 也可以是数字:比如想知道什么时候封锁一个IP地址(访问超过几次)。INCRBY命令让这些变得很容易,通过原子递增保持计

    3.List列表类型

    Redis中的List其实就是链表(redis 使用双端链表实现的 List),相信学过数据结构知识的人都应该能理解其结构。

    使用 List 结构,我们可以轻松地实现最新消息排行等功能(比如新浪微博的 TimeLine )。List 的另一个应用就是消息队列,可以利用 List 的 PUSH 操作,将任务存在 List 中,然后工作线程再用 POP 操作将任务取出进行执行。

    一个List类型的实例,列表包含的元素,相同元素可以重复出现:
    在这里插入图片描述
    需要注意的是:一个List结构可以有序的存储多个字符串,并且是允许元素重复的。

    (1)常用命令如下:
    在这里插入图片描述
    LPUSHRPUSH命令分别用于将元素推入列表的左端和右端;LPOPRPOP命令分别用于从列表的左端和右端弹出元素,也就是删除元素;

    其中对于LRANGE命令来说,使用0位范围的起始索引,-1为范围的结束索引,可以取出列表包含元素的所有元素。

    (2)除了上边比较常用的命令之外,Redis列表还可以从列表里边移除元素、将元素插入列表中间、将列表修剪至指定长度的命令,以及一些其他命令。

    (3)使用场景:

    微博 TimeLine
    消息队列
    

    4.Set集合类型

    Redis的集合和列表都可以存储多个字符串,他们的不同支持在于,列表可以存储多个相同的字符串,而集合通过使用散列表来保证自己存储的每个字符串都是各不相同的。

    Redis的集合使用的是无序的方式存储元素,所以不可以像List列表那样,将元素推入集合的某一端,或者从集合的某一端弹出元素。

    一个Set集合类型的实例,各不相同的元素,无序排列:
    在这里插入图片描述
    (1)常用命令如下:
    在这里插入图片描述
    (2)除了常见的命令之外,还有交集、并集、差集的计算,如下:
    在这里插入图片描述
    (3)使用场景:

    共同好友
    

    5.Hash散列类型

    Redis的散列可以存储多个键值对之间的映射。和字符串一样,散列存储的值既可以是字符串又可以是数字值,并且用户同样可以对散列存储的数字执行自增操作或者是自减操作。

    一个List散列类型的实例,是一个包含两个键值对的散列键:
    在这里插入图片描述
    (1)常用命令如下:

    (2)其他命令包含添加和删除键值对的命令、获取所有键值对的命令、以及对键值对的值进行自增和自减操作的命令,如下所示:
    在这里插入图片描述

    6.Redis的有序集合ZSet数据类型

    有序集合和散列一样,用于存储键值对;有序集合的键被称为成员member,每一个成员都是独一无二的;而有序集合的值被称为分值score,分值必须是浮点数。

    有序集合是Redis里面唯一一个既可以根据成员访问元素,又可以根据分值以及分值的排序来访问元素的结构。

    一个有序集合类型的实例,zset-key是一个包含两个元素的有序集合键:
    在这里插入图片描述
    1)常用命令如下:
    在这里插入图片描述

    展开全文
  • redis五种数据类型及其常见操作

    千次阅读 2020-02-26 14:45:37
    redis五种数据类型及其常见操作 Redis支持5种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。 1、string string是 redis 最基本类型,你可以理解成与 ...

    redis五种数据类型及其常见操作

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

    1、string

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

      常用命令:get、set、incr、decr、mget等。

      应用场景:String是最常用的一种数据类型,普通的key/ value 存储都可以归为此类,即可以完全实现目前 Memcached 的功能,并且效率更高。还可以享受Redis的定时持久化,操作日志及 Replication等功能。除了提供与 Memcached 一样的get、set、incr、decr 等操作外,Redis还提供了下面一些操作: 

    • 获取字符串长度
    • 往字符串append内容
    • 设置和获取字符串的某一段内容
    • 设置及获取字符串的某一位(bit)
    • 批量设置一系列字符串的内容

      使用场景:常规key-value缓存应用。常规计数: 微博数, 粉丝数。

    string
    增:
    127.0.0.1:6379> set name runoob             #批量增加:mset 
    OK
    
    查:
    127.0.0.1:6379> get name
    "runoob"
    
    改:
    127.0.0.1:6379> set name tom            #直接覆盖
    OK
    
    删:
    127.0.0.1:6379> del name
    (integer) 1
    

    2、hash

    hash 是一个键值(key => value)对集合。Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象

      常用命令:hget,hset,hgetall 等。

      应用场景:我们简单举个实例来描述下Hash的应用场景,比如我们要存储一个用户信息对象数据,包含以下信息:

        用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,如果用普通的key/value结构来存储,主要有以下2种存储方式:

        第一种方式将用户ID作为查找key,把其他信息封装成一个对象以序列化的方式存储,这种方式的缺点是,增加了序列化/反序列化的开销,并且在需要修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发进行保护,引入CAS等复杂问题。

        第二种方法是这个用户信息对象有多少成员就存成多少个key-value对儿,用用户ID+对应属性的名称作为唯一标识来取得对应属性的值,虽然省去了序列化开销和并发问题,但是用户ID为重复存储,如果存在大量这样的数据,内存浪费还是非常可观的。

        那么Redis提供的Hash很好的解决了这个问题,Redis的Hash实际是内部存储的Value为一个HashMap,并提供了直接存取这个Map成员的接口,如下图:

        也就是说,Key仍然是用户ID, value是一个Map,这个Map的key是成员的属性名,value是属性值,这样对数据的修改和存取都可以直接通过其内部Map的Key(Redis里称内部Map的key为field), 也就是通过 key(用户ID) + field(属性标签) 就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题,很好的解决了问题。

        这里同时需要注意,Redis提供了接口(hgetall)可以直接取到全部的属性数据,但是如果内部Map的成员很多,那么涉及到遍历整个内部Map的操作,由于Redis单线程模型的缘故,这个遍历操作可能会比较耗时,而另其它客户端的请求完全不响应,这点需要格外注意。

      使用场景:存储部分变更数据,如用户信息等。

    hash

    hgetall key     #不需要具体字段,直接获取整个hash值

    增:

    127.0.0.1:6379> hset 001 name zsq          #设置多个属性:hmset  001 name zsq age 18
    (integer) 1

    查:

    127.0.0.1:6379> hget 001 name
    "zsq"

    改:

    127.0.0.1:6379> hset 001 name zcf           #直接覆盖
    (integer) 0

    删:

    127.0.0.1:6379> del 001
    (integer) 1

            删掉hash的一个属性:

            127.0.0.1:6379> hdel  001 age
             (integer) 1 

     

    3、list

    list 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

      常用命令:lpush(添加左边元素),rpush,lpop(移除左边第一个元素),rpop,lrange(获取列表片段,LRANGE key start stop)等。

      应用场景:Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现。

        List 就是链表,相信略有数据结构知识的人都应该能理解其结构。使用List结构,我们可以轻松地实现最新消息排行等功能。List的另一个应用就是消息队列,
    可以利用List的PUSH操作,将任务存在List中,然后工作线程再用POP操作将任务取出进行执行。Redis还提供了操作List中某一段的api,你可以直接查询,删除List中某一段的元素。

      实现方式:Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。

      Redis的list是每个子元素都是String类型的双向链表,可以通过push和pop操作从列表的头部或者尾部添加或者删除元素,这样List即可以作为栈,也可以作为队列。 获取越接近两端的元素速度越快,但通过索引访问时会比较慢。

    使用场景:

      消息队列系统:使用list可以构建队列系统,使用sorted set甚至可以构建有优先级的队列系统。比如:将Redis用作日志收集器,实际上还是一个队列,多个端点将日志信息写入Redis,然后一个worker统一将所有日志写到磁盘。

    list

    增:

    127.0.0.1:6379> lpush list aa bb cc dd                       #lpush/rpush list XXX
    (integer) 4

    查:

    127.0.0.1:6379> LRANGE list 0 -1                         #查询整个列表
    1) "dd"
    2) "cc"
    3) "bb"
    4) "aa"

    改:

    127.0.0.1:6379> lset list 0 00                 #修改需要指定到对应下标
    OK

    删:

    127.0.0.1:6379> del list                      #删除整个列表
    (integer) 1

    127.0.0.1:6379> lrem list 1 aa            #从列表list左边开始删除1个aa的值
    (integer) 1

    解释:

    LREM key count value

    根据参数 count 的值,移除列表中与参数 value 相等的元素。

    count 的值可以是以下几种:

    count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
    count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
    count = 0 : 移除表中所有与 value 相等的值。

    4、set

    set是string类型的无序集合。集合是通过hashtable实现的,概念和数学中个的集合基本类似,可以交集,并集,差集等等,set中的元素是没有顺序的。所以添加,删除,查找的复杂度都是O(1)。

      sadd 命令:添加一个 string 元素到 key 对应的 set 集合中,成功返回1,如果元素已经在集合中返回 0,如果 key 对应的 set 不存在则返回错误。

      常用命令:sadd,spop,smembers,sunion 等。

      应用场景:Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

      Set 就是一个集合,集合的概念就是一堆不重复值的组合。利用Redis提供的Set数据结构,可以存储一些集合性的数据。

      案例:在微博中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。

      实现方式: set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。

    set

    增:

    127.0.0.1:6379> sadd ss aa bb cc
    (integer) 3

    删:

    127.0.0.1:6379> SREM ss bb
    (integer) 1

    查:

    127.0.0.1:6379> SMEMBERS ss
    1) "bb"
    2) "cc"
    3) "aa"

    5、zset

     zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。

      zadd 命令:添加元素到集合,元素在集合中存在则更新对应score。

      常用命令:zadd,zrange,zrem,zcard等

      使用场景:Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构,比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。和Set相比,Sorted Set关联了一个double类型权重参数score,使得集合中的元素能够按score进行有序排列,redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。比如一个存储全班同学成绩的Sorted Set,其集合value可以是同学的学号,而score就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。另外还可以用Sorted Set来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。

      实现方式:Redis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。

    zset

    增:

    127.0.0.1:6379> zadd zz 1 zz1
    (integer) 1
    127.0.0.1:6379> zadd zz 2 zz2
    (integer) 1
    127.0.0.1:6379> zadd zz 3 zz3
    (integer) 1

    查:

    127.0.0.1:6379> ZRANGE zz 0 -1
    1) "zz1"
    2) "zz2"
    3) "zz3"

    删:

    127.0.0.1:6379> ZREM zz zz2
    (integer) 1

    集合中元素数量:

    127.0.0.1:6379> ZCARD zz
    (integer) 2

    参考:https://www.cnblogs.com/jasonZh/p/9513948.html

     

    展开全文
  • 目录: 说明 字符串(string) list(列表) ...不同的数据类型数据结构差异就在于value结构不一样 字符串(string) value数据结构(数组) 字符串value数据结构类似于数组,采用与分配容...
  • 本章节将围绕上一章节的数据类型,针对不同的数据类型操作不同Redis命令。字符串(string)读/写/删简单命令写命令通过set关键字实现,set [key] [value]。127.0.0.1:6379> set hello worldOK读命令通过get关键字...
  • 简述Redis五种基本数据类型String字符串常用命令应用场景 Hash散列表常用命令使用场景 List链表常用命令应用场景 Set( 集合)常用命令应用场景 SortedSet( 有序集合) zset常用命令介绍应用场景 Redis三种特殊...
  • 常用的Redis数据类型包含了...本文重点讨论常用的五种数据类型底层的数据结构。String的数据结构Redis最基本也是最常用的数据类型就是String类型了,可以用来存储字符串、整数、浮点数。Redis 通过 hashtable 实...
  • Redis的五种数据类型

    2021-04-14 12:16:33
    Redis的五种数据类型,(string,list,散列hash,set,sorted set) redis的常见数据类型 string list hash set sorted set string: string是redis种最常用的数据结构,其中key-value也是string类型,尽管redis是...
  • 应用场景:string是redis最基本数据类型,key-value格式,一个key对应一个值情况下 1、设置key = value:set key value 2、追加一个值到key:append key value 3、取值:get key 4、增加键整数值一次:...
  • redis常见的五种数据类型:string、hash、list、set、sorted set(zset) string string是简单的key-value类型,效率高。 常用命令:get、set、incr、decr、mget等 应用:常规的key-value操作、常规计数(微博数、...
  • Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。 注:在redis中命令语句中,命令是忽略大小写,而key是不忽略大小写。 1、String类型 ...
  • 1、String 常用命令: 除了get、set、incr、decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 ...String是最常用种数据类型,普通key/value存储都可以归为此类,value其实不仅是St
  • Redis的五种数据类型及方法 字符串string: 字符串类型是Redis中最为基础的数据存储类型,是一个由字节组成的序列,他在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据货Json...
  • MySQL数据库表中的每一列都必须具有名称和数据类型。SQL开发人员必须在创建SQL表时...MySQL数据库支持所有标准SQL数值数据类型,涉及到了常见的5MySQL数据类型。1、整数类型,包括TINYINT、SMALLINT、MEDIUMINT...
  • 丰富的数据类型,包括String,List,Hash,Set,Sorted Sets,根据不同场景选择更适用的数据类型; 性能优势:数据存在内存,读写速度快,支持可达10W QPS; 高可用:支持主从复制,哨兵监听,集群部署;...
  • 本文介绍Python常见的7基本数据类型,如下:1、字符串2、布尔类型3、数字4、列表5、元组6、字典7、日期其中字符串,数字,列表,元祖,字典是Python的五个标准数据类型。每个数据类型其实都可以作为一篇文章深入...
  • 本文介绍Python常见的7基本数据类型,如下:1、字符串2、布尔类型3、数字4、列表5、元组6、字典7、日期其中字符串,数字,列表,元祖,字典是Python的五个标准数据类型。每个数据类型其实都可以作为一篇文章深入...
  • 五种常见编程语言的数据类型相互转换,你确定不来看看!!! 目录五种常见编程语言的数据类型相互转换,你确定不来看看!!!!!!!整型与浮点型整型转浮点型c,c++版java版Pythonjs浮点型转整型c,c++javajs整型与字符串整型转...
  • 字符串类型是Redis中最为基础的数据类型,是一个由字节组成序列,他在redis中是二进制安全,这就意味着该类型可以接受任何格式数据,如JPEG图像数据或Json对象描述信息等,是标准key-value。一般来存字符串...
  • Redis五种数据类型

    2019-04-12 08:37:24
    字符串string: 字符串类型是Redis中最为基础的数据存储类型,是一个由字节组成的序列,他在Redis中是二进制安全的,这便意味着该类型...应用场景:很常见的场景用于统计网站访问数量,当前在线人数等。incr命令(++...
  • 1、String 类型,这种为最常见的key-value类型存储于redis,通常可用作存储token,在存储是key值最好带有":"冒号方便查找 2、hash类型,相当于在redis中存储了一个hashMap集合,可用于一个key对应一个hash然后,一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 909
精华内容 363
关键字:

常见的五种数据类型