redis学习-redis基本数据结构

1.字符串

是redis中最简单的数据类型,通常用于缓存用户信息。key为userId,value为对象信息(以json字符串存储,存储时需要把user对象json序列化)

redis的字符串是动态字符串(类似于动态数组),采用空间预分配的形式来减少内存扩充次数。当字符串大小超过1M时,扩容都是翻倍的扩。

支持的操作:

1)单条读写:

redis语法:

 set key value

 get key

spring语法:

2)批量读写

redis:

 mset key1 value1 key2 value2 key3 value3

 mget key1 key2 key3

Spring:

3)过期操作和set命令拓展

redis:

1、先set再设置过期

 set key value

  expire key time     -----time的单位默认为秒S。

2、在set的同时设置过期时间

 setex key time value   ----time单位同样默认为秒

4)key不存在的时候才set,存在就不set了

 setnx key value

5)计数---value值为整数的情况下使用

 incr key ----增加1

 incr key x -----增加x

int型的value值是有范围的,最大值为9223372036854775807(long的最大值),超过的话redis会报错。

Spring语法:

 

2.list(列表)

redis中的列表是对应的是java语言里面的linkedList,而不是arrayList,所以插入和删除的速度贼快,时间复杂度为O(1),但是索引定位(查询)的效率很低,时间复杂度为O(n).

列表主要用于构建异步队列。也就是将需要延后处理的任务结构体序列化成字符串塞进 Redis 的列表,另一个线程从这个列表中轮询数据进行处理。(消息队列)

 

1.列表插入内容

Redis:

 rpush key(list的key) value1 value2 value3 ----批量操作

Spring:

2.从列表左侧取内容(和push操作结合将形成队列)

Redis:

 lpop key

Spring:

3.从列表右侧取内容(和push操作结合将形成堆栈)

Redis:

 rpop key

Spring:

4.慢操作(也就是时间复杂度比较大的操作)

1)lindex key index--从左边开始去get下标为index的元素

2)lrange key startIndex endIndex ---取出范围内的内容,不会影响原有列表如果 startIndex为0 endIndex为-1,则表示取出列表内的所有数据,-1代表倒数第一个元素

3)ltrim key startIndex endIndex ---类似于javaList的subList方法,根据index截取原列表,并替代原列表

5.list的底层实现

在redis中,list不是很标准的linkedlist,而是进化后的quicklist。也就是由ziplist+链表指针组成的。

 

3.hash

redis中的hash,类似于java中的hashMap,也是数组+链表的存储方式。不同之处在于redis的hash,value值只能存储字符串。其次,java的hashMap和redis的hash在rehash时也有很大差别。hashMap是整体rehash,是一个会阻塞的操作,而hash是渐进式rehash,是一个不会阻塞的操作。

注:rehash指的是hashMap的扩容操作。

 

常见应用场景

hash 结构也可以用来存储用户信息,不同于字符串一次性需要全部序列化整个对象,hash 可以对用户结构中的每个字段单独存储。这样当我们需要获取用户信息时可以进行部分获取。而以整个字符串的形式去保存用户信息的话就只能一次性全部读取,这样就会比较浪费网络流量。

hash 也有缺点,hash 结构的存储消耗要高于单个字符串,到底该使用 hash 还是字符串,需要根据实际情况再三权衡。

常见操作

1、插值

redis:

 hset hashName key value(只能是字符串)

spring:

2、获取hash中的key和value

reids

 hgetall  hashName

结果:

 key1

 value1

 key2

 value2

3、获取hash中的键值对的个数

redis

 hlen hashName

4、获取某个value

redis

 hget hashName key

5、批量插值(key相同时执行更新操作,而不是插入)

redis

 hmset hashName key1 value1 key2 value2 key3 value3

6、针对单个value进行计数(自增操作)

redis

 hincrby hashName key num ---针对value增加的数目

 

4.set

 相当于java的hashSet,内部的键值对是无序的,也是唯一的(key是唯一的),内部是特殊的字典,因为字典的value默认是null,相当于我们操作的都是key。--不像list可以push重复的内容

 因为去重的特性,所以,set有个应用场景就是用来存储中奖的用户id,因为set自带去重的功能。--用于一些value不能重复的场景。

常见操作:

1、插入(支持批量)

 redis

 sadd setName key1 key2 key3

2、判断set中是否存在这个key

 redis

 sismembers setName key

3、获取set中所有的对象

 reids

 smember setName

4、获取set的长度

 redis

 scard setName

5、获取第一个对象

  redis

 spop setName

 

5.zset(有序集合)

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

在实际应用中常用于排序。--在插入的时候就会自动根据score排序,相当于zset里面的内容就是有序的,不需要人工排序。

 

zset的最后一个元素被取出后,数据结构会被自动回收,从而释放内存。

 

书中举出的两个例子--这也是为什么redis可以用来搞top10,就是靠这个结构

 

基本操作

1.添加元素(单个)

Redis

 zadd key score value

Spring

2.取出某个范围内的内容

Reids

 zrange key startIndex endIndex

Spring

3.逆序取出某个范围的内容(系统需要进行逆序处理)

Redis

  zrerange key startIndex endIndex

Spring

4.获取集合中成员个数

Redis

 zcard key

Spring

5.获取指定value的score

redis

 zscore key value

Spring

6.取出分值区间类的成员

Redis

 zrangebysocre key startscore endscore

特殊:

zrangebyscore books -inf 8.91 withscores      # 根据分值区间 (-∞, 8.91] 遍历 zset,同时返回分值。inf 代表 infinite,无穷大的意思。

Spring

7.删除成员

Redis

 zrem key value

spring

 

 

注:跳跃列表结构简介

 

元素需要身兼很多级的职务,当有新的元素插入时,新的元素从最头上一级进行比较,如果大于则放前面,小于放后面--类似于二分法查找的思路。然后一级,一级的比较下去,直到找到合适的位置放这个对象,需要比到第0级。最顶层为31层。

 

 

以上内容均总结自:https://juejin.im/book/5afc2e5f6fb9a07a9b362527,有兴趣的同学可以去买来看看~~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值