redis学习笔记2-数据结构

1. 几个全局命令

查看所有键:keys *  //需要遍历所有键,性能差

键总数:dbsize  //直接返回redis键总数变量,不会遍历所有键

键是否存在:exists key  //存在返回1

删除键:del key [key...] //无论值是什么类型都能删除 返回删除键的个数

键过期:expire key seconds //设置键过期时间,过期后自动删除,如果某个键设置了过期时间后又更新了值,那么会自动取消过期时间

键对应的值的类型:type key //返回值类型如字符串、hash、集合、列表等,如果键不存在,返回none

键重命名:rename key newkey

随机返回一个键:randomkey

设置键且键在N秒后过期:setex key n 

2. 数据结构的内部编码

指令:object encoding key

3. 单线程架构

客户端提交指令给redis的任务队列,redis从任务队列中取出指令进行执行,执行完成后放到返回队列。

优点:

纯内存访问

非阻塞I/O,redis利用I/O多路复用技术实现

单线程避免线程切换以及竞态消耗

缺点:如果有命令执行时间过长,则会造成其他命令阻塞

4. 字符串 string

字符串可以是简单字符串、复杂字符串(json、xml)、数字(整数、浮点数)、二进制数据,最多不能超过512M

常用命令:

set key value [ex seconds][px milliseconds][nx|xx]

ex seconds:秒级过期时间

px milliseconds:毫秒级过期时间

nx:key不存在时设置,类似增加,和setnx 指令效果一样,可用于分布式锁的实现方案(redis单线程)

xx:key存在时设置,类似更新,和setxx指令效果一样

get key :获取key对应的值,如果值不存在返回nil

mset key value [key value]:批量设置键值对

mget key [key]:批量获取值,如果某个值不存在,则该值对应的返回为nil,原子操作

    注意:

     mset和mget如果数量过多,可能引起网络阻塞或redis阻塞

     和pipeline不同,这个是原子操作

计数:

 incr key //如果值不是整数则报错,值不存在则按值为0自增

 decr key //自减

 incrby ke //自增指定数字

 decrby key //自减指定数字

 incrbyfloat key //自增浮点数

总结:

        谨慎使用复杂度高的批量操作指令,即批量时个数需要限制

内部编码:

    ·int:8个字节的长整型。

    ·embstr:小于等于39个字节的字符串。

    ·raw:大于39个字节的字符串。

    Redis会根据当前值的类型和长度决定使用哪种内部编码实现。

使用场景:

缓存功能、计数、共享session、限速(比如同个用户在1秒内不能请求多次同一个URL)

5. 哈希 hash

redis的hash类似于Java中的Map<String,Map<String,String>>的数据结构,外层key为全局的key,k可以通过redis的keys * 指令查询到,内层的key类似Java一个对象的字段名。

常用命令:

hset key field value:成功返回1,失败返回0

hget key field:获取值,如果key或field不存在,返回nil

hdel key field [field..]:删除key对应的一个或多个field,返回成功删除的个数

hlen key:返回key对应的field字段数

hmget key field[field..]:批量获取key的字段对应的值

hmset key field value[field value]:批量设置key的字段和值

hexists key field:判断某个key对应的field是否存在,返回1表示存在

hkeys key:获取key对应的所有field

hvals key:获取key对应的所有value

hgetall key:获取key对应的所有的字段及其值

总结:

注意批量操作的几个指令的复杂度

内部编码:

·ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)、同时所有值都小于hash-max-ziplist-value配置(默认64字节)时,Redis会使用ziplist作为哈希的内部实现,ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀。

·hashtable(哈希表):当哈希类型无法满足ziplist的条件时,Redis会使用hashtable作为哈希的内部实现,因为此时ziplist的读写效率会下降,而hashtable的读写时间复杂度为O(1)。

例子:

当field个数比较少且没有大的value时,内部编码为ziplist

当有value大于64字节,内部编码会由ziplist变为hashtable

当field个数超过512,内部编码也会由ziplist变为hashtable

使用场景:

    缓存某个对象实例

    使用原生字符串类型:

    如:set user:1:name "zhangsan"  set user:1:age 23

    优点:简单直观,每个属性都支持更新操作

    缺点:占用过多的键,内存占用量大,对象内聚性差

    总结:生产环境一般不用

    序列化字符串类型:

    如将value值序列化成json对象

    优点:简化编程,可以提高内存使用率

    缺点:序列化、反序列化有一定的开销,每次更新属性都需要经历反序列化、更新、序列化、提交给redis

    总结:如果数据为只读或不常更新,可以使用

    哈希类型:

    优点:简单直观,合理使用可以提高内存使用率

    缺点:要控制哈希在ziplist和hashtable两种内部编码的转换,hashtable会消耗更多内存

    总结:使用,但需要注意字段个数和字段值大小(即汉字不要超过64/3)

 

6. 列表 list

    一个列表最多可以存储2的32次方-1个元素,在redis中可以对列表进行2端插入和2端弹出,可以用来当栈和队列使用。列表中的元素是有序的,可以通过下标获取,元素可以重复,类似Java中的List,但其底层实现为双向链表。

内部编码:

·ziplist(压缩列表):当列表的元素个数小于list-max-ziplist-entries配置(默认512个),同时列表中每个元素的值都小于list-max-ziplist-value配置时(默认64字节),Redis会选用ziplist来作为列表的内部实现来减少内存的使用。

·linkedlist(链表):当列表类型无法满足ziplist的条件时,Redis会使用linkedlist作为列表的内部实现。

例子:

当元素个数较少且没有大元素时,内部编码为ziplist

当元素个数超过512个,内部编码变为linkedlist

当某个元素超过64字节,内部编码会变为linkedlist

使用场景:

·lpush+lpop=Stack(栈)

·lpush+rpop=Queue(队列)

·lpsh+ltrim=Capped Collection(有限集合)

·lpush+brpop=Message Queue(消息队列)

7. 集合 set

和Java中的set类似,不允许重复、无序,和列表一样,最多可以存储2的31次方减1个元素

常用指令:

sadd key element[element..]

srem key element [element...]

scard key :获取元素个数,返回内部计数变量

sismember key element:元素是否在集合中,1为是

srandmember key [count]:随机从集合中返回count个元素

spop key [count]:随机从集合中弹出count个元素

smembers key:获取所有元素

sinter key [key...]:求多个集合的交集

suinon key [key... ]:求多个集合的并集

sdiff key [key...]:求多个集合的差集

sinterstore newkey key[key...]:求多个集合的交集并保存到newkey集合中

suinonstore newkey key[key...]: 求多个集合的并集并保存到newkey集合中

sdiffstore newkey key[key...]: 求多个集合的差集并保存到newkey集合中

内部编码:

·intset(整数集合):当集合中的元素都是整数且元素个数小于set-max-intset-entries配置(默认512个)时,Redis会选用intset来作为集合的内部实现,从而减少内存的使用。

·hashtable(哈希表):当集合类型无法满足intset的条件时,Redis会使用hashtable作为集合的内部实现。

当元素个数较少且都为整数时,内部编码为intset

当元素个数超过512个,内部编码变为hashtable

当某个元素不为整数时,内部编码也会变为hashtable

使用场景:

·sadd=Tagging(添加标签)

·spop/srandmember=Random item(生成随机数,比如抽奖)

8. 有序集合

和set一样元素不能重复,每个元素都有一个分数属性,根据分数进行排序,分数可以重复。

常用指令:

zadd key score member [nx|xx|ch|incr] [score member...]:向key集合添加元素

·nx:member必须不存在,才可以设置成功,用于添加。

·xx:member必须存在,才可以设置成功,用于更新。

·ch:返回此次操作后,有序集合元素和分数发生变化的个数

·incr:对score做增加,相当于后面介绍的zincrby。

zcard key:返回成员个数

zscore key member:返回某个成员的分数

zrank/zrevrank key member:计算某个成员的排名,升序/降序

zrem key member [member...]:删除成员

zincrby key scores member:为成员增加scores分数

zrang/zrevrange key startindex endindex [withscores]:返回升序/降序排列从start开始到end结束

zrangebyscore key min max [withscores] [limit offset count]:按照分数从低到高返回,[limit offset count]选项可以限制输出的起始位置和个数

zcount key min max:返回指定分数范围的成员个数

zremrangebyrank key start end:删除指定排名内的升序元素

zremrangebyscore key min max:删除指定分数范围的成员

总结:

有序集合和集合相比,很多功能都要耗时些。

内部编码:

·ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplist-entries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配置(默认64字节)时

·skiplist(跳跃表):当ziplist条件不满足时,有序集合会使用skiplist作为内部实现

当元素个数较少且每个元素较小时,内部编码为skiplist

当元素个数超过128个,内部编码变为ziplist

当某个元素大于64字节时,内部编码也会变为hashtable

使用场景:

    添加或减少分数

    分数排行榜

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值