精华内容
下载资源
问答
  • 介绍redis五种数据类型的使用场景,更便于学习redis的操作,了解使用!
  • 主要介绍redis五种数据类型在Java中的详细使用 , 注释特别详细, 里面有我邮箱, 不懂的地方随时问我. 非常值得学习. 更多redis资料, 请与我邮箱联系!
  • Redis五种数据类型

    万次阅读 多人点赞 2018-06-07 21:38:32
    乐观锁:心很大,每次去拿数据的时候都不认为别人会修改,在取数据的时候不会加锁,乐观锁可以理解为一检测机制,只是在更新数据的时候会判断一下别人是否已经修改了,如果已经修改了就放弃此次的更新操作,进行重试。...

    强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan

    Redis简介

    在没有redis之前,客户端访问后端应用时,当并发大的时候,存储层如mysql是支撑不了的,可能会将存储层mysql压死,存储层一旦宕机,整个应用就完了。为了很高效的加速应用的读写速度,同时也可以降低后端负载在一定程度上可以通过AOF和RDB机制保证在一定的情况下(如缓存层宕机)快速恢复数据为应用提供服务。缓存层可以通过主从复制+哨兵或集群实现高可用。Redis(REmote DIctionary Server)是一个开源的使用ANSI C语言编写的基于内存亦可持久化的日志型,key-value数据库,并提供了多种语言。它通常被称为数据结构服务器,因为值可以是string,hash,list,set,zset. Redis采用了单线程架构和I/O多路复用模型来实现高性能的内存数据库服务,Redis执行命令的速度非常快,官方给出的数字是读写性能可以达到10万/秒,在单线程的架构下为什么能如此快呢?主要有四点原因:①redis的所有数据是存放在内存中的②redis是C语言实现的,C语言实现的程序距离操作系统更近③Redis使用了单线程架构,预防了多线程可能产生的竞争问题,例如,CPU频繁切换,资源竞争等问题。④Redis源代码非常少,可以说是精打细磨的。 ![这里写图片描述](https://img-blog.csdn.net/20180607205750524?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poMTU3MzI2MjE2Nzk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

    基本数据结构

    **1.字符串(String):** 可以是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字(整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能超过512MB ![这里写图片描述](https://img-blog.csdn.net/20180607202339870?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poMTU3MzI2MjE2Nzk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
    • 命令
      添加元素
    //ex:秒级过期时间,nx:键不存在时才能设置成功,xx键存在时才能设置成功
    set key value [ex seconds] [px milliseconds] [nx|xx]
    

    获取值

    get key
    

    批量设置值

    mset key value [key value ...]
    mset a 1 b 2 c 3 d 4
    

    批量获取值

    mget key [key ...]
    mget a b c d
    

    计数

    incr key
    

    追加值

    append key value
    

    字符串长度

    strlen key
    

    设置并返回原值

    getset key value
    

    设置指定位置的字符

    setrange key offeset value
    //例子
     set redis pest
     setrange redis 0 b
     get redis
     结果:"best"
    

    获取部分字符串

    getrange key start end
    
    • 内部编码
      i. int 长整型
      ii. embstr 短字符(<=39字节)
      iii. raw 长字符(>39)
    • 使用场景
      i. 缓存
      这里写图片描述
    //  定义键
    userRedisKey = "user:info:" + id;
    //  从 Redis 获取值
    value = redis.get(userRedisKey);
    if (value != null) {
    //  将值进行反序列化为 UserInfo 并返回结果
    userInfo = deserialize(value);
    return userInfo;
    }
    

    ii. 计数:点赞,视频播放量,每播放一次就+1

    long incrVideoCounter(long id) {
    key = "video:playCount:" + id;
    return redis.incr(key);
    }
    

    iii. 接口防刷:验证码登录,公司一般的验证码等发短信功能都是调用的第三方接口,如果被有心之人利用了,会给公司造成一定的损失,所以简单的解决方法就是限流

    phoneNum = "138xxxxxxxx";
    key = "shortMsg:limit:" + phoneNum;
    // SET key value EX 60 NX
    isExists = redis.set(key,1,"EX 60","NX");
    if(isExists != null || redis.incr(key) <=5){
    //  通过
    }else{
    //  限速
    }
    
    **2.哈希(hash):**哈希类型是指键值本身又是一个键值对结构,value={{field1,value1},...{fieldN,valueN}} ![这里写图片描述](https://img-blog.csdn.net/20180607210008695?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poMTU3MzI2MjE2Nzk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
    • 命令
    //设置值
    hset key field value
    
    //获取值
    hget key field
    
    //删除field
    hdel key field [field ...]
    
    //计算field个数
    hlen key
    
    //批量设置或获取field-value
    hmset key field value [field value ...]
    hmget key field [field ...]
    
    //判断field是否存在
    hexists key field
    
    //获取所有field
    hkeys key
    
    //获取所有value
    hvals key
    
    //获取所有的field-value
    hgetall key
    
    //以某种形式自增
    hincrby key field
    hincrbyfloat key field
    
    //计算value的字符串长度
    hstrlen key field
    
    • 内部编码
      i. ziplist:当field个数不超过hash-max-ziplist-entries(默认为512个)时,并且没有大value(64个字节以上算大)
      ii. hashtable:ziplist的两个条件只要有一个不符合就会转换为hashtable
    • 使用场景
      i. 存储用户信息
      § 原生string:直观,占用键多
      § 序列化字符串:序列化后好操作,每次都需要反序列化和序列化所有字段
      § 哈希类型:简单直观,减少内存空间的使用

      **3.列表(list)😗*用来存储多个有序的字符串,列表中的每个字符串称为元素(element),一个列表最多可以存储2^32 -1个元素
      这里写图片描述
    • 命令
    //从右边插入元素
    rpush key value [value ...]
    
    //从左边插入元素
    lpush key value [value ...]
    
    //向某个元素前或者后插入元素
    linsert key before|after pivot value
    
    //获取指定范围内的元素列表
    lrange key start end
    
    //获取列表指定索引下标的元素
    lindex key index
    
    //获取列表长度
    llen key
    
    //从列表左侧弹出元素
    lpop key
    
    //从列表右侧弹出
    rpop key
    
    //删除指定元素,count>0从左到右,count<0从右到左,count=0,删除所有
    lrem key count value
    
    //按照索引范围修剪列表
    ltrim key start end
    
    //修改指定索引下标的元素:
    lset key index newValue
    
    //阻塞式弹出
    //列表为空,则按照设置的timeout值进行阻塞
    //列表不为空,则会立即返回
    blpop key [key ...] timeout
    brpop key [key ...] timeout
    
    • 内部编码
      i. ziplist(压缩列表):当列表的元素个数小于list-max-ziplist-entries配置
      (默认512个),同时列表中每个元素的值都小于list-max-ziplist-value配置时
      (默认64字节),Redis会选用ziplist来作为列表的内部实现来减少内存的使
      用。
      ii. linkedlist(链表):当列表类型无法满足ziplist的条件时,Redis会使用
      linkedlist作为列表的内部实现。
    • 使用场景
      i. 消息队列:Redis的lpush+brpop命令组合即可实现阻塞队列

      **4.集合(set)😗*用来保存多个的字符串元素,但和列表类型不一样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素。
      这里写图片描述
    • 命令
      添加元素
    sadd key element ...
    sadd myset a b c
    

    删除元素

    srem key element [element ...]
    //返回成功删除元素个数
    srem myset a b
    

    计算元素个数

    scard key
    

    判断元素是否在集合中

    sismember key element
    

    随机从集合返回指定个数元素

    srandmember key [count]
    

    从集合随机弹出元素

    spop key
    

    获取所有元素

    smembers key
    

    多个集合求交集

    sinter key [key ...]
    

    多个集合求并集

    suinon key [key ...]
    

    求多个集合的差集

    sdiff key [key ...]
    

    将交集、并集、差集的结果保存

    sinterstore destination key [key ...]
    suionstore destination key [key ...]
    sdiffstore destination key [key ...]
    
    • 内部编码
      i. intset(整数集合):当集合中的元素都是整数且元素个数小于set-max-
      intset-entries配置(默认512个)时,Redis会选用intset来作为集合的内部实
      现,从而减少内存的使用。
      ii. hashtable(哈希表):当集合类型无法满足intset的条件时,Redis会使
      用hashtable作为集合的内部实现。
    • 使用场景
      i. 给用户添加标签
    sadd user:1:tags tag1 tag2 tag5
    

    ii.抽奖
    生成随机数,集合不能存放相同的元素,因此随机pop出一个元素,可以作为中奖的号码
    iii. 社交需求:可以给用户推荐有相同兴趣的人,用于交友。

    **5.有序集合(zset)😗*不能有重复的元素,而且还可以排序,它和列表使用索引下标作为排序依据不同的是,它给每个元素设置一个分数(score)作为排序的依据
    这里写图片描述

    • 命令
      添加成员
    zadd key score member
    zadd user:ranking 251 tom
    

    计算成员个数

    zcard key
    zcard user:ranking
    

    计算某个成员的分数,如果成员不存在,则返回nil

    zscore key member
    zscore user:ranking tom
    

    计算成员的排名,zrank是分数从低到高,zrevrank从高到低

    zrank key member
    zrevrank key member
    

    删除成员

    zrem key member
    //将成员mike从有序集合user:ranking中删除
    zrem user:ranking mike
    

    增加成员的分数

    zincrby key increment member
    //给tom增加了9分,分数变为了260分
    zincrby user:ranking 9 tom
    

    返回指定排名范围的成员

    //从低到高返回
    zrange key start end [withscores]
    //从高到低返回
    zrevrange key start end [withscores]
    //返回排名最低的是三个成员
    zrange user:ranking 0 2 withscores
    1) "kris"
    2) "1"
    3) "frank"
    4) "200"
    5) "tim"
    6) "220"
    

    返回指定分数范围的成员

    zrangebyscore key min max [withscores] [limit offset count]
    zrevrangebyscore key max min [withscores] [limit offset count]
    

    返回指定分数范围成员个数

    zcount key min max
    

    删除指定排名内的升序元素

    zremrangebyrank key start end
    

    删除指定分数范围的成员

    zremrangebyscore key min max
    

    求两个集合交集

    zinterstore destination numkeys key [key ...] [weights weight [weight ...]]
    [aggregate sum|min|max]
    //求交集,结果保存到user:ranking:1_inter_2
    zinterstore user:ranking:1_inter_2 2 user:ranking:1
    user:ranking:2
    

    求并集

    zunionstore destination numkeys key [key ...] [weights weight [weight ...]]
    [aggregate sum|min|max]
    //求并集
    zunionstore user:ranking:1_union_2 2 user:ranking:1
    user:ranking:2
    
    • 内部编码
      i. ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplist-entries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配置(默认64字节)时,Redis会用ziplist来作为有序集合的内部实现,ziplist可以有效减少内存的使用。
      ii. skiplist(跳跃表):当ziplist条件不满足时,有序集合会使用skiplist作为内部实现,因为此时ziplist的读写效率会下降。
    • 使用场景
      i. 用户点赞数排行
      ii. 排行榜
      iii. 展示用户信息及用户分数(例如学校中按学生分数排序)
    展开全文
  • Redis五种数据类型的底层实现

    千次阅读 2020-02-24 17:52:32
    Redis数据类型也称大数据对象;前面介绍过6大数据结构,Redis并没有直接使用这些结构来实现键值对数据库,而是使用这些结构构建了一个对象系统redisObject;这个对象系统包含了大数据对象,字符串对象...

    简介

    Redis的五大数据类型也称五大数据对象;前面介绍过6大数据结构,Redis并没有直接使用这些结构来实现键值对数据库,而是使用这些结构构建了一个对象系统redisObject;这个对象系统包含了五大数据对象,字符串对象(string)、列表对象(list)、哈希对象(hash)、集合(set)对象和有序集合对象(zset);而这五大对象的底层数据编码可以用命令OBJECT ENCODING来进行查看。

    redisObject结构

    typedef struct redisObject {
        // 类型
        unsigned type:4;
        // 编码
        unsigned encoding:4;
        // 指向底层实现数据结构的指针
        void *ptr;
        // ...
    } robj;
    

    redis是以键值对存储数据的,所以对象又分为键对象和值对象,即存储一个key-value键值对会创建两个对象,键对象和值对象。
    键对象总是一个字符串对象,而值对象可以是五大对象中的任意一种。

    • type属性存储的是对象的类型,也就是我们说的 string、list、hash、set、zset中的一种,可以使用命令 TYPE key 来查看。
    • encoding属性记录了队形所使用的编码,即这个对象底层使用哪种数据结构实现。

    在这里插入图片描述
    表中列出了底层编码常量及对应的OBJECT ENCODING 命令的输出,前三项都是字符串结构

    我们在存入key-value键值对时并不会指定对象的encoding,而是Redis会根据不统的使用场景来为一个对象设置不同的编码,可以达到节约内存、加快访问速度等目的。

    字符串对象(string)

    字符串对象底层数据结构实现为简单动态字符串(SDS)和直接存储,但其编码方式可以是int、raw或者embstr,区别在于内存结构的不同。

    (1)int编码

    字符串保存的是整数值,并且这个正式可以用long类型来表示,那么其就会直接保存在redisObject的ptr属性里,并将编码设置为int,如图:
    在这里插入图片描述

    (2)raw编码

    字符串保存的大于32字节的字符串值,则使用简单动态字符串(SDS)结构,并将编码设置为raw,此时内存结构与SDS结构一致,内存分配次数为两次,创建redisObject对象和sdshdr结构,如图:
    在这里插入图片描述

    (3)embstr编码

    字符串保存的小于等于32字节的字符串值,使用的也是简单的动态字符串(SDS结构),但是内存结构做了优化,用于保存顿消的字符串;内存分配也只需要一次就可完成,分配一块连续的空间即可,如图:
    在这里插入图片描述
    字符串对象总结:

    • 在Redis中,存储long、double类型的浮点数是先转换为字符串再进行存储的。
    • raw与embstr编码效果是相同的,不同在于内存分配与释放,raw两次,embstr一次。
    • embstr内存块连续,能更好的利用缓存在来的优势
    • int编码和embstr编码如果做追加字符串等操作,满足条件下会被转换为raw编码;embstr编码的对象是只读的,一旦修改会先转码到raw。

    列表对象(list)

    3.2版本之前:列表对象的编码可以是ziplist和linkedlist之一。

    (1) ziplist编码

    ziplist编码的哈希随想底层实现是压缩列表,每个压缩里列表节点保存了一个列表元素。
    在这里插入图片描述

    (2)linkedlist编码

    linkedlist编码底层采用双端链表实现,每个双端链表节点都保存了一个字符串对象,在每个字符串对象内保存了一个列表元素。
    在这里插入图片描述
    列表对象编码转换:

    • 列表对象使用ziplist编码需要满足两个条件:一是所有字符串长度都小于64字节,二是元素数量小于512,不满足任意一个都会使用linkedlist编码。
    • 两个条件的数字可以在Redis的配置文件中修改,list-max-ziplist-value选项和list-max-ziplist-entries选项。
    • 图中StringObject就是上一节讲到的字符串对象,字符串对象是唯一个在五大对象中作为嵌套对象使用的。

    3.2版本之后:列表对象的编码quicklist。

    quicklist编码

    quickList 是 zipList 和 linkedList 的混合体,它将 linkedList 按段切分,每一段使用 zipList 来紧凑存储,多个 zipList 之间使用双向指针串接起来。
    在这里插入图片描述
    在这里插入图片描述
    Redis 还会对 ziplist 进行压缩存储,使用 LZF 算法压缩,可以选择压缩深度。
    quicklist 默认的压缩深度是 0,也就是不压缩。压缩的实际深度由配置参数list-compress-depth决定。为了支持快速的 push/pop 操作,quicklist 的首尾两个 ziplist 不压缩,此时深度就是 1。如果深度为 2,就表示 quicklist 的首尾第一个 ziplist 以及首尾第二个 ziplist 都不压缩。
    ziplist长度:
    quicklist 内部默认单个 ziplist 长度为 8k 字节,超出了这个字节数,就会新起一个 ziplist。
    ziplist 的长度由配置参数 list-max-ziplist-size 决定。

    哈希对象(hash)

    哈希对象的编码可以是ziplist和hashtable之一。

    (1)ziplist编码

    ziplist编码的哈希对象底层实现是压缩列表,在ziplist编码的哈希对象中,key-value键值对是以紧密相连的方式放入压缩链表的,先把key放入表尾,再放入value;键值对总是向表尾添加。
    在这里插入图片描述

    (2)hashtable编码

    hashtable编码的哈希对象底层实现是字典,哈希对象中的每个key-value对都使用一个字典键值对来保存。
    字典键值对即是,字典的键和值都是字符串对象,字典的键保存key-value的key,字典的值保存key-value的value。
    在这里插入图片描述
    哈希对象编码转换:

    • 哈希对象使用ziplist编码需要满足两个条件:一是所有键值对的键和值的字符串长度都小于64字节;二是键值对数量小于512个;不满足任意一个都使用hashtable编码。
    • 以上两个条件可以在Reids配置文件中修改hash-max-ziplist-value选项和hash-max-ziplist-entries选项。

    集合对象(set)

    集合对象的编码可以是intset和hashtable之一。

    (1)intset编码

    intset编码的集合对象底层实现是整数集合,所有元素都保存在整数集合中。
    在这里插入图片描述

    (2)hashtable编码

    hashtable编码的集合对象底层实现是字典,字典的每个键都是一个字符串对象,保存一个集合元素,不同的是字典的值都是NULL;可以参考java中的hashset结构。
    在这里插入图片描述
    集合对象编码转换:

    • 集合对象使用intset编码需要满足两个条件:一是所有元素都是整数值;二是元素个数小于等于512个;不满足任意一条都将使用hashtable编码。
    • 以上第二个条件可以在Redis配置文件中修改et-max-intset-entries选项。

    有序集合对象(zset)

    有序集合的编码可以是ziplist和skiplist之一。

    (1)ziplist编码

    ziplist编码的有序集合对象底层实现是压缩列表,其结构与哈希对象类似,不同的是两个紧密相连的压缩列表节点,第一个保存元素的成员,第二个保存元素的分值,而且分值小的靠近表头,大的靠近表尾。
    在这里插入图片描述

    (2)skiplist编码

    skiplist编码的有序集合对象底层实现是跳跃表和字典两种;
    每个跳跃表节点都保存一个集合元素,并按分值从小到大排列;节点的object属性保存了元素的成员,score属性保存分值;
    字典的每个键值对保存一个集合元素,字典的键保存元素的成员,字典的值保存分值。
    在这里插入图片描述
    为何skiplist编码要同时使用跳跃表和字典实现?

    • 跳跃表优点是有序,但是查询分值复杂度为O(logn);字典查询分值复杂度为O(1) ,但是无序,所以结合连个结构的有点进行实现。
    • 虽然采用两个结构但是集合的元素成员和分值是共享的,两种结构通过指针指向同一地址,不会浪费内存。

    有序集合编码转换:

    • 有序集合对象使用ziplist编码需要满足两个条件:一是所有元素长度小于64字节;二是元素个数小于128个;不满足任意一条件将使用skiplist编码。
    • 以上两个条件可以在Redis配置文件中修改zset-max-ziplist-entries选项和zset-max-ziplist-value选项。

    应用场景

    redis一般应用场景

    • 缓存会话(单点登录)
    • 分布式锁,比如:使用setnx
    • 各种排行榜或计数器
    • 商品列表或用户基础数据列表等
    • 使用list作为消息对列
    • 秒杀,库存扣减等

    五种类型的应用场景

    • String,redis对于KV的操作效率很高,可以直接用作计数器。例如,统计在线人数等等,另外string类型是二进制存储安全的,所以也可以使用它来存储图片,甚至是视频等。
    • hash,存放键值对,一般可以用来存某个对象的基本属性信息,例如,用户信息,商品信息等,另外,由于hash的大小在小于配置的大小的时候使用的是ziplist结构,比较节约内存,所以针对大量的数据存储可以考虑使用hash来分段存储来达到压缩数据量,节约内存的目的,例如,对于大批量的商品对应的图片地址名称。比如:商品编码固定是10位,可以选取前7位做为hash的key,后三位作为field,图片地址作为value。这样每个hash表都不超过999个,只要把redis.conf中的hash-max-ziplist-entries改为1024,即可。
    • list,列表类型,可以用于实现消息队列,也可以使用它提供的range命令,做分页查询功能。
    • set,集合,整数的有序列表可以直接使用set。可以用作某些去重功能,例如用户名不能重复等,另外,还可以对集合进行交集,并集操作,来查找某些元素的共同点
    • zset,有序集合,可以使用范围查找,排行榜功能或者topN功能。

    总结

    在Redis的五大数据对象中,string对象是唯一个可以被其他四种数据对象作为内嵌对象的;

    列表(list)、哈希(hash)、集合(set)、有序集合(zset)底层实现都用到了压缩列表结构,并且使用压缩列表结构的条件都是在元素个数比较少、字节长度较短的情况下;

    四种数据对象使用压缩列表的优点:
    (1)节约内存,减少内存开销,Redis是内存型数据库,所以一定情况下减少内存开销是非常有必要的。
    (2)减少内存碎片,压缩列表的内存块是连续的,并分配内存的次数一次即可。
    (3)压缩列表的新增、删除、查找操作的平均时间复杂度是O(N),在N再一定的范围内,这个时间几乎是可以忽略的,并且N的上限值是可以配置的。
    (4)四种数据对象都有两种编码结构,灵活性增加。

    展开全文
  • Redis redis五种数据类型和使用场景

    千次阅读 2019-05-03 16:00:29
    一、redis基本基本介绍 1、 redis解决分布式环境下缓存不同步 让缓存集中处理(大家使用同一个缓存服务),我们需要一个类似于MYSQL这样可以通过服务来提供第三方的缓存工具(缓存服务器);流行的第三方缓存服务器:...
    一、redis基本基本介绍

    1、 redis解决分布式环境下缓存不同步
    让缓存集中处理(大家使用同一个缓存服务),我们需要一个类似于MYSQL这样可以通过服务来提供第三方的缓存工具(缓存服务器);流行的第三方缓存服务器:memcache/redis
    2、REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统(可以把redis想象成一个巨大的MAP)。Redis和ehcache不一样的是,ehcache可以看做一个嵌入式的缓存框架,而redis是一个独立的应用服务(像MYSQL一样),既可以提供缓存功能,还可以把数据持久化到磁盘上(redis也可以提供持久化的功能,在某些情况下,redis也可以作为数据库存在);
    3、性能极高 – Redis能支持超过 10W次每秒的读写频率。丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
    原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行(简单的事务)。
    丰富的特性 – Redis还支持 publish/subscribe(发布/订阅), 通知, key 过期等等特性。

    二、redis基本命令和存储

    redis命令分为:
      对数据的操作;
      发布/订阅相关操作;
      事务控制;
      脚本命令;
      连接服务器命令;
      数据库服务相关命令;
    redis存储:
    1,redis可以作为内存数据库,也可以把数据持久化到磁盘上;大部分情况下,都是把redis作为内存数据库;
    2,默认情况下
      #after 900 sec (15 min) if at least 1 key changed
      #after 300 sec (5 min) if at least 10 keys changed
      #after 60 sec if at least 10000 keys changed
    在redis配置文件中:
      save 900 1
      save 300 10
      save 60 10000
    3,数据默认存储在安装目录下.rdb文件中(可以在配置文件中dbfilename dump.rdb配置);
    4,redis也可以设置为append模式,每次key的修改都会append到文件中,这种方式有可能丢失60秒的数据;
      通过配置:appendonly yes开启
      appendfilename "appendonly.aof"设置append文件;
      可以设置append的模式(类似于mysql的事务文件同步机制):
         # appendfsync always:每次更新key及时同步到append文件;
         # appendfsync everysec:每一秒同步一次key的更新;
        # appendfsync no:不管理append文件的更新,根据操作系统去定

    三、redis中String数据类型 http://redis.cn/commands.html#string

    1、常见的字符串操作:
      strlen key:返回key的value的值长度;
      getrange key X Y:返回key对应value的一个子字符串,位置从X到Y;
      append key value:给key对应的value追加值,如果key不存在,相当于set一个新的值;
    2、如果字符串的内容是数值(integer,在redis中,数值也是string)
      incr key:在给定key的value上增加1;(常用于id);redis中的incr是一个原子操作,支持并发;如果key不存在,则相当于设置1;
      incrby key value:给定key的value上增加value值;相当于key=key.value+value;这也是一个原子操作;
      decr:在给定key的value上减少1;
      decrby key value:给定key的value上减少value值;
    3、string最常见的使用场景:
    存储json类型对象
      incr user:id
      set user:1 {id:1,name:xiaolong}   第一个user设置属性
       incr user:id  incr 是原子操作,支持并发
      set user:2 {id:2,name:stef}  第二个user设置属性
    作为计数器,
      incr count;
    优酷视频点赞(为第100个视频点赞统计)
       初   始   set vedio:100:goodcount 0
       点   赞   incr vedio:100:good:count
      取消点赞   decr vedio:100:good:count

    四、redis中的List http://redis.cn/commands.html#list

    1、redis的LIST结构(想象成java中的List),是一个双向链表结构,可以用来存储一组数据;从这个列表的前端和后端取数据效率非常高;
    2、list的常用操作:
      RPUSH:在一个list最后添加一个元素
    RPUSH firends “stef”
      LPUSH:在一个list最前面添加一个元素
    LPUSH firends “stea”
      LTRIM key start stop:剪裁一个列表,剩下的内容从start到stop;
    LTRIM friends 0,3 =>只剩下前4个数据;
      LRANGE key start stop:获取列表中的一部分数据,两个参数,第一个参数代表第一个获取元素的位置(0)开始,第二个值代表截止的元素位置,如果第二个参数为-1,截止到列表尾部==>LRANGE firends 0 -1
      LLEN key: 返回一个列表当前长度==>LLEND friends
      LPOP:移除list中第一个元素,并返回这个元素==>LPOP friends
      RPOP:移除list中最后一个元素,并返回这个元素==>RPOP friends
    在这里插入图片描述
    3,使用场景:
    ①可以使用redis的list模拟队列,堆栈
    ②朋友圈点赞;
     规定:朋友圈内容的格式:
        内容: user❌post:x content来存储;
        点赞: post❌good list来存储;
     创建一条微博内容:set user:1:post:91 ‘hello redis’;
     点赞:
         lpush post:91:good ‘{id:1,name:stef,img:xxx.jpg}’
         lpush post:91:good ‘{id:2,name:xl,img:xxx.jpg}’
         lpush post:91:good ‘{id:3,name:xm,img:xxx.jpg}’
    ③查看有多少人点赞: llen post:91:good
    ④查看哪些人点赞:lrange post:91:good 0 -1
    思考,如果用数据库实现这个功能,SQL会多复杂??

    示例2:回帖
      ①创建一个帖子:
        set user:1:post:90 ‘wohenshuai’
      ②创建一个回帖:
        set postreply:1 ‘nonono’
      ③把回帖和帖子关联:
        lpush post:90:replies 1
      ④再来一条回帖:
        set postreply:2 ‘hehe’
         lpush post:90:replies 2
     ⑤查询帖子的回帖:
        lrange post:90:replies 0 -1
         get postreply:2

    五、redis中的Set http://redis.cn/commands.html#set

    1、SET结构和java中差不多,数据没有顺序,并且每一个值不能重复;
    2、SET结构的常见操作:
        SADD:给set添加一个元素==>SADD language ‘java’
        SREM:从set中移除一个给定元素==>SREM language ‘php’
        SISMEMBER:判断给定的一个元素是否在set中,如果存在,返回1,如果不存在,返回0==>sismember language ‘php’
        SMEMBERS:返回指定set内所有的元素,以一个list形式返回==>smembers language
        SCARD:返回set的元素个数==>scard language
        SRANDMEMBER key count:返回指定set中随机的count个元素==> srandmember friends 3 //随机推荐3个用户(典型场景,抽奖)
        SUNION(并集):综合多个set的内容,并返回一个list的列表,包含综合后的所有元素;
             sadd language ‘php’
             sadd pg ‘c’
             sadd pg ‘c++’
             sadd pgs ‘java’
             sadd pgs ‘swift’
             sunion language pg pgs
        SINTER key [key …] (交集):获取多个key对应的set之间的交集
    SINTER friends:user:1000 friends:user:1001 friends:user:1002 =>获取1000,1001,1002三个用户的共同好友列表;
         SINTERSTORE destination key [key …] :获取多个key对应的set之间的交集,并保存为新的key值;目标也是一个set;
    SINTER groupfriends friends:user:1000 friends:user:1001 friends:user:1002 =>获取三个用户共同的好友列表并保存为组好友列表;
    3、set的使用场景:
    ①、去重;
    ②、抽奖;
        准备一个抽奖池:sadd luckdraws 1 2 3 4 5 6 7 8 9 10 11 12 13
        抽3个三等奖:srandmember luckdraws 3
    srem luckdraws 11 1 10
        抽2个二等奖:
    三、做set运算(好友推荐)
        初始化好友圈
              sadd user:1:friends ‘user:2’ ‘user:3’ ‘user:5’
              sadd user:2:friends ‘user:1’ ‘user:3’ ‘user:6’
              sadd user:3:friends ‘user:1’ ‘user:7’ ‘user:8’
        把user:1的好友的好友集合做并集;
             user:1 user:3 user:6 user:7 user:8
        让这个并集和user:1的好友集合做差集;
             user:1 user:6 user:7 user:8
        从差集中去掉自己
              user:6 user:7 user:8
        随机选取推荐好友
    在这里插入图片描述
    在这里插入图片描述

    六、redis中的Sort Set http://redis.cn/commands.html#sorted_set

    1、SET是一种非常方便的结构,但是数据无序,redis提供了一个sorted set,每一个添加的值都有一个对应的分数,可以通过这个分数进行排序;sorted set中的排名是按照分组升序排列
    2、Sortedset的常用操作:
       ZADD:添加一个带分数的元素,也可以同时添加多个:
            ZADD hackers 1940 “Alan Kay”
            ZADD hackers 1906 “Grace Hopper”
            ZADD hackers 1969 “Linus Torvalds”
            ZADD hackers 1940 “Alan Kay” 1906 “Grace Hopper” 1969 “Linus Torvalds”
       ZCOUNT key min max :给定范围分数的元素个数:
       ZCOUNT hackers 1940 1960 =>1940到1960的hacker个数;
       ZRANK key member :查询指定元素的分数在整个列表中的排名(从0开始)
       ZRANK hackers “Alan Kay” =>alan kay的年龄在所有hacker中的排名;
       zrange hackers 0 -1 =>
         1) “Grace Hopper”
         2) “Alan Kay”
         3) “Linus Torvalds”
       ZREVRANGE key start stop:按照分数从小到大排;
    3、sorted set的使用场景:sorted set算是redis中最有用的一种结构,非常适合用于做海量的数据的排行(比如一个巨型游戏的用户排名);sorted set中所有的方法都建议大去看一下;sorted set的速度非常快;
    示例1,天梯排名:
      1,添加初始排名和分数:
      2,查询fat在当前ladder中的排名:
      3,查询ladder中的前3名:
      4,jian增加了20ladder score: 在这里插入图片描述
    示例2:
       LRU淘汰最长时间没使用;
       LFU淘汰最低使用频率;

    七、redis中的hash http://redis.cn/commands.html#hash

    1、hashes可以理解为一个map,这个map由一对一对的字段和值组成,所以,可以用hashes来保存一个对象:
    2、hashes的常见操作:
     HSET:给一个hashes添加一个field和value;
        HSET user:1000 name “John Smith”
        HSET user:1000 email "john.smith@example.com"
        HSET user:1000 password “s3cret”
     HGET可以得到一个hashes中的某一个属性的值:
        HGET user:1000 name =>“John Smith”
     HGETALL:一次性取出一个hashes中所有的field和value,使用list输出,一个field,一个value有序输出;
       HGETALL user:1000 =>
        1) “name”
        2) “John Smith”
        3) “email”
        4) "john.smith@example.com"
        5) “password”
        6) “s3cret”
     HMSET:一次性的设置多个值(hashes multiple set)
        HMSET user:1001 name “Mary Jones” password “hidden” email "mjones@example.com"
     HMGET:一次性的得到多个字段值(hashes multiple get),以列表形式返回;
        HMGET user:1001 name email =>
        1)“Mary Jones”
        2)“mjones@example.com”
     HINCRBY:给hashes的一个field的value增加一个值(integer),这个增加操作是原子操作:
        HSET user:1000 visits 10
        HINCRBY user:1000 visits 1 => 11
        HINCRBY user:1000 visits 10 => 21
     HKEYS:得到一个key的所有fields字段,以list返回:
        HKEYS user:1000 =>
        1)“name”
        2)“password”
        3)“email”
     HDEL:删除hashes一个指定的filed;
        HDEL user:1000 visits
    3、使用场景:
      使用hash来保存一个对象更直观;(建议不使用hash来保存)
      分组
         set user:id 1
        set dept:id 1
        HMSET ids user:id 1 dept:id 1 orderbill:id 1
        HINCRBY ids user:id
        HINCRBY ids dept:id
        HMSET users user:1 “{id:1,name:xx}” user:2 “{id:2,name:xx}”
    学redis:
    redis在线入门 : http://try.redis.io/
    redis 中文资料站: http://www.redis.cn/
    redis 命令手册: http://www.redisdoc.com/en/latest/index.html

    展开全文
  • 2.Redis五种数据类型及使用场景

    万次阅读 2021-08-07 09:52:49
    通过使用场景,带大家快速掌握Redis五种数据类型。string (字符串)、list (列表)、set (集合)、hash (哈希) 和 zset (有序集合)。

    Redis 有 5 种基础数据结构,分别为:string (字符串)、list (列表)、set (集合)、hash (哈希) 和 zset (有序集合)。

    Redis 所有的数据结构都是一个key对应一个value,不同类型的数据结构之间的差异就在于value的结构不同,例如string数据类型,他的value就是一个字符串,list数据类型,他的value是一个链表。

    1.String

    字符串 String 是 Redis 最简单的数据结构,可以存储字符串、整数或者浮点数。最常见的应用场景就是对象缓存,例如缓存用户信息,key是"userInfo"+#{用户ID},value是用户信息对象的JSON字符串。

    案例:

    key:userInfo123

    value:{“gender”:1,“nickname”:“java程序鱼”,“userId”:123}

    Redis String基本操作

    127.0.0.1:6379> set name hzy # 设置
    OK
    127.0.0.1:6379> get name # 获取
    "hzy"
    127.0.0.1:6379> exists name  # 判断是否存在
    (integer) 1
    127.0.0.1:6379> del name # 删除
    (integer) 1
    127.0.0.1:6379> get key
    (nil)
    

    Redis String批量操作

    可以批量对多个字符串进行读写,节省网络耗时开销。

    127.0.0.1:6379> mset name1 xiaoming name2 xiaohong # 批量设置
    OK
    127.0.0.1:6379> mget name1 name2 # 批量获取
    1) "xiaoming"
    2) "xiaohong"
    

    Redis String计数操作

    如果 value 值是一个整数,我们可以对它进行自增长操作。自增长是有范围的,它的范围是 signed long 的最大最小值,超过了这个值,Redis 会报错。

    127.0.0.1:6379> incr likenum # 自增1
    (integer) 1
    127.0.0.1:6379> get likenum
    "1"
    127.0.0.1:6379> decr likenum # 减1
    (integer) 0
    127.0.0.1:6379> get number
    "0"
    

    Redis String过期操作

    127.0.0.1:6379> expire name 60 # 设置超时时间
    (integer) 1
    127.0.0.1:6379> setex name 60 value # 等价于 setex + expire
    OK
    127.0.0.1:6379> ttl key # 查看数据还有多久过期
    (integer) 11
    

    字符串是由多个字节组成,每个字节又是由 8 个 bit 组成

    Redis String使用场景

    • 缓存:像我们平时开发,经常会把一个对象转成json字符串,然后放到redis里缓存

    • 计数器:像博客文章的阅读量、评论数、点赞数等等

    • 分布式系统生成自增长ID

    2. List

    Redis 的列表相当于 Java 语言里面的 LinkedList。

    LinkedList优点:插入性能高,不管是从末尾插入还是中间插入

    LinkedList缺点:随机读性能差,例如LinkedList.get(10),这种操作,性能就很低,因为他需要遍历这个链表,从头开始遍历这个链表,直到找到index = 10的这个元素为止。

    Redis List 数据类型如何实现队列?

    右边进左边出

    127.0.0.1:6379> rpush apps qq # 将元素插入到列表的尾部(最右边)
    (integer) 1
    127.0.0.1:6379> rpush apps wechat taobao # 将多个元素插入到列表的尾部(最右边)
    (integer) 3
    127.0.0.1:6379> lpop apps # 移除并返回列表的第一个元素(最左边)
    "qq"
    127.0.0.1:6379> lrange apps 0 1 # 返回列表中指定区间内的元素,0表示第一个,1表示第二个,-1表示最后一个
    1) "wechat"
    2) "taobao"
    127.0.0.1:6379> lrange apps 0 -1 # -1表示倒数第一
    1) "wechat"
    2) "taobao"
    

    注意: 当列表弹出了最后一个元素之后,该数据结构自动被删除,内存被回收

    Redis List 数据类型如何实现栈?

    先进先出,右边进右边出

    127.0.0.1:6379> rpush apps qq wechat taobao
    (integer) 3
    127.0.0.1:6379> rpop apps # 移除列表的最后一个元素,返回值为移除的元素
    "taobao"
    

    Redis List 使用场景

    • 异步队列

    • 任务轮询(RPOPLPUSH)

    • 文章列表(lrange key 0 9)

    3.Hash

    Redis的Hash结构相当于Java语言的HashMap,内部实现结构上与JDK1.7的HashMap一致,底层通过数据+链表实现。

    Redis Hash 常用命令

    127.0.0.1:6379> hmset userInfo name "hzy" age "24" sex "1"
    OK
    127.0.0.1:6379> hexists userInfo name # 相当于HashMap的containsKey()
    (integer) 1
    127.0.0.1:6379> hget userInfo name # 相当于HashMap的get()
    "hzy"
    127.0.0.1:6379> hget userInfo age
    "24"
    127.0.0.1:6379> hgetall userInfo # 数据量大时,谨慎使用!获取在哈希表中指定 key 的所有字段和值
    1) "name"
    2) "hzy"
    3) "age"
    4) "24"
    5) "sex"
    6) "1"
    127.0.0.1:6379> hkeys userInfo # 数据量大时,谨慎使用!获取 key 列表
    1) "name"
    2) "age"
    3) "sex"
    127.0.0.1:6379> hvals userInfo # 获取 value 列表
    1) "hzy"
    2) "24"
    3) "1"
    127.0.0.1:6379> hset userInfo name "test" # 修改某个字段对应的值
    127.0.0.1:6379> hget userInfo name
    "test"
    

    Redis Hash 使用场景

    • 记录整个博客的访问人数(数据量大会考虑HyperLogLog,但是这个数据结构存在很小的误差,如果不能接受误差,可以考虑别的方案)

    • 记录博客中某个博主的主页访问量、博主的姓名、联系方式、住址

    4.Set

    Redis的set集合相当于Java的HashSet。Redis 中的 set 类型是一种无序集合,集合中的元素没有先后顺序。

    补充:HashSet就是基于HashMap来实现的,HashSet,他其实就是说一个集合,里面的元素是无序的,他里面的元素不能重复的,HashMap的key是无顺序的,你插入进去的顺序,跟你迭代遍历的顺序是不一样的,而且HashMap的key是没有重复的,HashSet直接基于HashMap实现的。

    Redis Set 常用命令

    127.0.0.1:6379> sadd apps wechat qq # 添加元素
    (integer) 2
    127.0.0.1:6379> sadd apps qq # 重复
    (integer) 0
    127.0.0.1:6379> smembers apps # 注意:查询顺序和插入的并不一致,因为 set 是无序的
    1) "qq"
    2) "wechat"
    127.0.0.1:6379> scard apps # 获取长度
    (integer) 2
    127.0.0.1:6379> sismember apps qq # 谨慎使用!检查某个元素是否存在set中,只能接收单个元素
    (integer) 1
    127.0.0.1:6379> sadd apps2 wechat qq
    (integer) 2
    127.0.0.1:6379> sinterstore apps apps apps2 # 获取 apps 和 apps 的交集并存放在 apps3 中
    (integer) 1
    127.0.0.1:6379> smembers app3
    1) "qq"
    2) "wechat"
    

    注意: 当集合中最后一个元素移除之后,数据结构自动删除,内存被回收

    Redis Set 使用场景

    • 微博抽奖:如果数据量不是特别大的时候,可以使用spop(移除并返回集合中的一个随机元素)或srandmember(返回集合中一个或多个随机数)

    • QQ标签:一个用户多个便签

    • 共同关注(交集)

    • 共同好友(交集)

    5.sorted set

    sorted set 有序集合,sorted set 增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列,还可以通过 score 的范围来获取元素的列表。使得它类似于Java的TreeSet和HashMap的结合体。

    Sorted set 常用命令

    127.0.0.1:6379> zadd apps 3.0 qq # 添加元素到 sorted set 中,3.0是score的值
    (integer) 1
    127.0.0.1:6379> zadd apps 2.0 wechat 1.0 aliyun # 一次添加多个元素
    (integer) 2
    127.0.0.1:6379> zcard apps # 查看 sorted set 中的元素数量
    (integer) 3
    127.0.0.1:6379> zscore apps wechat # 查看某个 value 的权重
    "2.0"
    127.0.0.1:6379> zrange apps 0 -1 # 通过索引区间返回有序集合指定区间内的成员,0 -1 表示输出所有元素
    1) "aliyun"
    2) "wechat"
    3) "qq"
    127.0.0.1:6379> zrange apps 0 1 # 通过索引区间返回有序集合指定区间内的成员
    1) "aliyun"
    2) "wechat"
    127.0.0.1:6379> zrevrange apps 0 1 # 相当于zrange的反转
    1) "qq"
    2) "wechat"
    

    注意: sorted set 中最后一个 value 被移除后,数据结构自动删除,内存被回收

    Sorted set 使用场景

    • 排行榜

    • 订单支付超时(下单时插入,member为订单号,score为订单超时时间戳,然后写个定时任务每隔一段时间执行zrange)

    展开全文
  • Redis五种数据类型详解

    千次阅读 2018-07-22 07:40:59
    redis数据类型分为:字符串类型、散列类型、列表类型、集合类型、有序集合类型。redis这么火,它运行有多块?一台普通的笔记本电脑,可以在1秒钟内完成十万次的读写操作。...
  • redis五种数据类型及其常见操作

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

    万次阅读 多人点赞 2015-10-30 11:31:24
    本文详细介绍这五种数据类型的使用方法。本文命令介绍部分只是列举了基本的命令,至于具体的使用示例,可以参考Redis官方文档:Redis命令大全 字符串类型 字符串是Redis中最基本的数据类型,它能够存储任何...
  • Redis 五种数据类型

    千次阅读 2021-11-10 21:57:36
    文章目录前言一、String 数据类型1. SET/GET/APPEND/STRLEN2. INCR/DECR/INCRBY/DECRBY3. GETSET4. SETEX5. SETNX6. MSET/MGET/MSETNX二、List 数据类型1. LPUSH/LPUSHX/LRANGE2. LPOP/LLEN3. LREM/LSET/LINDEX/...
  • Redis五种数据类型-设置key的过期时间Redis五种数据类型1.String:key-value(做缓存)1.1set key值 value值1.2 get key值1.3incr key值,将对应value值递增1 (生成id, 网站访问量)1.4decr key值 将对应value值...
  • redis 五种数据类型的使用场景

    万次阅读 多人点赞 2014-11-12 12:26:38
    String 1、String 常用命令: 除了get、set、incr、decr mget等操作外,Redis还提供了下面一些操作: ...String是最常用的一种数据类型,普通的key/value存储都可以归为此类,value其实不仅是String
  • redis五种数据类型

    万次阅读 2020-08-26 21:55:12
    redis数据类型,以及每种数据类型的使用场景 回答:一共五种 (一)String 这个其实没啥好说的,最常规的set/get操作,value可以是String也可以是数字。一般做一些复杂的计数功能的缓存。 (二)hash 这里value...
  • redis 五种数据类型和应用场景

    万次阅读 2018-09-04 21:39:21
    字符串类型redis最基础的数据结构,首先键是字符串类型,而且其他几结构都是在字符串类型基础上构建的, 所以字符串类型能为其他四种数据结构的学习尊定基础。 字符串类型实际上可以是字符串 (简单的字符串、...
  • Redis五种基本数据类型底层实现

    千次阅读 2020-09-24 10:57:00
    Redis五种基本数据类型底层实现 1、Redis是什么 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 **字符串(strings), 散列(hashes),...
  • Redis五种数据类型及其底层原理

    千次阅读 多人点赞 2021-01-08 21:11:15
    Redis常用的五种数据类型分别是:String、List、Set、Hash、Zset。 一、Redis五种类型的常用命令 1.1 String String是 redis 最基本的数据类型。一个 key 对应一个value。redis的String可以表示任何数据,比如 ...
  • String类型 ​ 可以是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字(整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能超过512M ​ 实现方式: 一个字符串,被redisObject所引用...
  • Redis五种数据类型及其使用场景

    万次阅读 多人点赞 2020-05-25 22:58:57
    五种类型与类比java的模型 string --> String hash --> Hashmap list --> LinkList set --> HashSet sorted_set --> TreeSet String类型 redis 数据存储格式 redis自身是一个Map类型的存储方式,...
  • Redis五数据类型应用场景

    万次阅读 多人点赞 2018-07-21 16:17:30
    本博客转自java思维导图公众号,大家可以关注,里面有很多料,可以碎片化时间学习。这里主要为了记录归档,日后不断理解,因为看一遍吸收的难以应用自如。...Redis最为常用的数据类型主要有以下...
  • redis 五种数据类型

    万次阅读 2016-12-22 19:32:27
    除了get、set、incr、decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一段内容 设置及获取字符串的某一位(bit) 批量设置一系列字符串的内容 ...
  • Redis五种数据结构详解

    千次阅读 2020-09-01 15:27:00
    Redis五种数据结构包括以下五种: String:字符串类型 List:列表类型 Set:无序集合类型 ZSet:有序集合类型 Hash:哈希表类型 但是作为一名优秀的程序员可能不能只停留在只会用这五种类型进行crud工作,还是得...
  • Redis五种数据类型及应用场景

    千次阅读 2020-03-05 22:36:08
    1、什么是 Redis? Redis 是完全开源免费的,遵守 BSD 协议,是一个高性能的 key-value 数据库。 ...(1)Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进...
  • redis的5种数据类型

    万次阅读 多人点赞 2018-01-25 20:43:02
    1.redis的5种数据类型: string 字符串(可以为整形、浮点型和字符串,统称为元素) list 列表(实现队列,元素不唯一,先入先出原则) set 集合(各不相同的元素) hash hash散列值(hash的key必须是唯一的...
  • Redis 五种数据类型总结

    千次阅读 2021-11-09 20:06:15
    目录引言一、String 数据类型1. SET/GET/APPEND/STRLEN2. INCR/DECR/INCRBY/DECRBY3. GETSET4. SETEX5. SETNX6. MSET/MGET/MSETNX二、List 数据类型1. LPUSH/LPUSHX/LRANGE2. LPOP/LLEN3. LREM/LSET/LINDEX/LTRIM4. ...
  • Redis常用数据类型

    千次阅读 2018-06-11 12:18:50
    redis是键值对的数据库,有5中主要数据类型:字符串类型(string),散列类型(hash),列表类型(list),集合类型(set),有序集合类型(zset)几个基本的命令:keys * 获得当前数据库的所有键
exists key [key ...
  • Redis五种数据类型的应用场景

    千次阅读 2021-05-29 20:39:56
    1、redis不仅支持k/v类型数据,同时还提供了list,set,zset,hash数据结构的存储。 2、redis支持集群化,即master-slave模式的主从复制 3、redis支持数据的持久化,可将内存数据保存在磁盘中,重启的时候可以再次...
  • Redis五种数据结构底层实现简析

    千次阅读 2020-08-02 15:23:15
    Redis的字符串是基于C语言的,没有Java这种操作字符串的类库,因此Redis自动封装了一个,为SDS(Simple Dynamic String),SDS中包含了三个属性: len,buf中已经占有的字符串长度(字符串实际长度) free,buf中未使用...
  • java操作redis五种数据类型

    千次阅读 2018-08-07 09:00:37
    一、项目必备Jar包 ...redis.clients&lt;/groupId&gt; &lt;artifactId&gt;jedis&lt;/artifactId&gt; &lt;version&gt;2.9.0&lt;/version&gt; &lt;/dependen
  • Redis中5种数据类型的底层数据结构

    千次阅读 2019-08-13 20:07:58

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 235,517
精华内容 94,206
关键字:

redis的五种数据类型

redis 订阅