Redis基本数据类型

五种数据类型

string

数据结构

内部结构为字符串数组

最大容量

521MB

实现原理

类似java的ArrayList,采用预分配容量的方式,一般分配的capacity要高于实际字符串的长度len。当字符串小于1MB时,扩容是加倍现有的空间。如果字符串长度超过1MB,扩容时每一次只增加1MB。需要注意的是字符串最大长度为512MB。

命令

  • set name ‘xiaobai’
  • get name
  • mset name1 ‘xiaobai’ name2 ‘xiaohei’
  • mget name1 name2
  • expire name 5 设置key为name的值 过期时间为5秒
  • ttl name 查看剩余过期时间
  • setex name 5 xiaobai 设置name为xiaobai并设置5秒过期时间,相当于 set和expire两个命令合并为原子操作
  • setnx name xiaobai 当key为name 不存在时才设置值为xiaobai

计数

如果value为一个整数,可以进行自增或自减操作,最大长度为long 64位,它的范围在signed long 的最大值和最小值之间,超过这个范围,redis会报错。

  • incr count 自增1
  • incrby count 100 自增100
  • decr count 自减1
  • decrby count 100 自减100

list

数据结构

内部结构为快速链表(quicklist),在元素较少的清空下,会使用一块连续的内存存储,这个结构是ziplist,即压缩列表。它将所有的元素彼此紧挨着一起存储,分配的是一块连续的内存。当数据量比较多的时候才会改成quicklist。因为普通的链表需要的附加指针空间太大,会浪费空间,还会加重内存的碎片化。所以redis将链表和ziplist结合起来组成了quicklist,也就是多个ziplist使用双向指针串起来使用。

实现原理

类似java里的LinkedList,为双向链表,插入和删除操作非常快,时间复杂度为o(1),但是索引定位很慢,时间复杂度为O(n)

命令

  • lpush mylist java python c++ //头插法
  • lpop mylist
  • rpush mylsit java python c++ //尾插法
  • rpop mylist
  • lindex mylist 0 //类似java链表的 get(int index) 速度会随索引增大而下降
  • lrange mylist 0 -1 //全部打印 -1可以代表遍历到倒数第一个
  • ltrim mylist 0 1 //保留list中的索引0到1的元素 ltrim mylist 1 0 清空链表

hash(字典)

数据结构

redis字段的值只能是字符串

实现原理

  • 相当于java里的HashMap,数组加链表。
  • 采用渐进式rehash策略,在rehash的同事,保留新旧两个hash结构,旧hash的内容一点点地迁移到新的hash结构中,当搬迁完成后,就会使用新的hash结构取而代之。
  • hash缺点是存储消耗要高于单个字符串。

命令

  • hset books java ‘thinking in java’
  • hget books java
  • hgetall books
  • hlen books
  • hmset books java ‘thinking in java’ python ‘python book’ //批量
  • hincrby user age 100 //自增

set(集合)

数据结构

实现原理

相当于java里的HashSet,它内部的键值对是无序的、唯一的。它的内部实现相当于一个特殊的字典,字典中的所有的value都是一个值NULL。

命令

  • sadd myset 1 2 3 4 5 //可以同时添加多个
  • smembers myset //遍历所有成员
  • sismembers myset 1 //查询1是否存在
  • scard myset //获取长度
  • spop myset //弹出一个 应该是随机的

zset(有序列表)

数据结构

它的内部实现用的是一种叫做“跳跃列表”的数据结构

实现原理

类似于java的SortedSet和HashMap的结合体,一方面它是一个set,保证内部value的唯一性,另一方面它可以给每个value赋予一个score,代表这个value的排序权重,它的内部实现用的是一种叫做“跳跃列表”的数据结构。

命令

  • zadd books 10 java 9 c++ 8 python
  • zrange books 0 -1 //按分数升序
  • zrevrange books 0 -1 //按分数降序
  • zcard books //大小
  • zscore books java //查看java的分数
  • zrank books java //查看分数升序排名 排名从索引0开始 ,返回 2
  • zrevrank books java //查看分数升序排名 ,返回 0
  • zrangebyscore books 8 9 //按分数8到9 遍历 可选参数withscores 显示分数
  • zrangebyscore books -inf 10 //-inf代表负无穷大 inf代表无穷大
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值