在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是4294967295。
从元素插入和删除的效率视角来看,如果我们是在链表的两头插入或删除元素,这将会是非常高效的 *** 作,即使链表中已经存储了百万条记录,该 *** 作也可以在常量时间内完成。然而需要说明的是,如果元素插入或删除 *** 作是作用于链表中间,那将会是非常低效的。相信对于有良好数据结构基础的开发者而言,这一点并不难理解。
我们知道Redis默认有16个数据库,默认是第0个数据库,那么如果在需要对数据库进行切换的时候,我们就可以使用下面这个命令:
使用如下命令进行切换
如果想要清除指定某一个数据库的数据
清除所有数据库的数据
接下来这个命令应该是最常用的了
平常在开发中,我们还需要经常对key进行判断,判断其是否存在
因为我们设置的缓存数据一般都不能是永久的,这个时候就需要我们在存储数据的时候,就为其设置过期时间。
string类型是Redis中五大基本数据类型之一,这也是最常使用到的一个数据类型,所有很多小伙伴们对Redis的认识和 *** 作就仅仅的停留在了对Redis的 *** 作层面,但是你是否知道string类型中的相关命令,还是有非常多实用的
接下来先看一下对string类型进行基本存储和获取的命令。
如果我们存储的string中的内容是数字的话,我们也可以对其进行增或减 *** 作,Redis可以自动的对字符串进行相关的 *** 作。实现的命令如下:
使用msetnx时,同时设置一个或多个 key-value 对,当且仅当所有给定 key都不存在时才成立。
getset命令从字面意思就可以看出来,他的作用是先get再set。
总结string类似的使用场景:
在使用list类型进行存取的时候,有两个命令需要进行区分:
注意:只有pop和push才分左右,其他的l都是list的意思
总结:
总结set集合一般用于元素的不重复的场景,比如抽奖系统,轮播等场景下
在使用hash集合的时候,要注意,hash其实就是一个Map集合,key-map的时候,值是一个map集合的形式进行存储的,也和Java中的hashmap有一个类似。
HVALS获取所有的value,HKEYS获取所有的key,HGETALL获取所有的键值
总结:
hash可以用于存储变更的数据,比如user,name,age等,尤其是用户信息之类的,hash更加适合用于对象的存储,string更加适合用于字符串的存储。
在set集合的基础上增加一个序列号,来进行排序
ZRANGEBYSCORE使用语法
总结
以上是在对五种数据类型进行存取时的一些常用命令 *** 作。关于其他的命令使用,小伙伴们在用到的时候可以直接入官网查看就可以了。
压缩链表 好处:节省内存空间,因为它存储的内容都是在连续的内存区域当中的当列表对象元素不大,每个元素也不大的时候,就采用zipList存储 但当数据量过大时,zipList就不那么好用了 因为为了保证它存储内容在内存中的连续性,插入的复杂度为O(N),即每次插入都会重新进行realloc
zipList的结构如下:
因为zipList是一段连续的内存,插入的时间复杂度O(n),而且每当插入新的元素需要realloc做内存拓展;而且如果超出zipList内存大小,还会做重新分配的内存空间,并将内容复制到新的地址 如果数量大的话,重新分配内存和拷贝内存会消耗大量时间 所以不适合大型字符串,也不适合存储量多的元素
是zipList和linkedList的混合体,是将linkedList按段切分,每一段用zipList来紧凑存储,多个zipList之间使用双向指针链接
linkedList的附加空间相对太高,prev和next指针就要占去16字节,而且每个节点都是单独分配,会加剧内存的碎片化,影响内存管理效率
quickList结构如下
结构图如下:
zipList的长度
内部默认单个zipList的长度为8K字节,超出了这个字节数,就会新起一个zipList关于长度可以使用list-max-zipList-size决定
压缩深度
quickList是由多个zipList组成的,同时为了进一步节省空间,Redis还会对zipList进行压缩存储,使用LZF算法压缩,可以选择压缩深度quickList默认压缩深度为0,即不压缩 压缩的实际深度由配置参数list-compress-depth决定为了支持快速push/pop *** 作,quickList的首尾两个zipList不压缩,此时深度就是1如果深度为2,就表示quickList的首尾第一个zipList以及首尾第二个zipList都不压缩
查询出来的结果集是返回一个List,然后你倒序添加数据到redis里面就可以了。
// 返回一个数据库查询结果集,list
List<Map> list = userServicegetUserList();
//倒序把数据放进去就好了,不然取出来的数据,跟你查询出来的结果数据是相反的
for (int i = listsize() - 1; i >= 0; i--) {
RedisPoolgetClient()lpush("userList", listget(i)toString());
}
----------------------------下面是RedisPool类-------------
import redisclientsjedisJedis;
/
redis缓存运用
@author TongJun
/
public class RedisPool {
// redis 对象
private static Jedis jedis = null;
private static final String IP = "127001";
private static final int PROT = 6379;
/
单例模式构造redis对象
@return
/
public static synchronized Jedis getClient() {
if (jedis == null) {
jedis = new Jedis(IP, PROT);
}
return jedis;
}
}
String是redis最基础和最常用的数据结构,其值最大能存储 512MB,可以是简单字符串、复杂的xml/json的字符串、二进制图像或者音频的字符串、以及可以是数字的字符串。String底层使用的是SDS,是Redis的一种基本数据结构,主要是用于存储字符串和整数。
21 set命令 set key value
用于设置给定key的值,如果key存储了其他值,覆盖写入,无视类型。
22 get命令 get key
获取指定key的值,如果key不存在返回nil
23 getset命令 get key [value]
该命令用于获取指定的key的旧值,然后按照新值对key进行赋值。当key中没有旧值的时候返回nil。
24 mget命令 get key1 [key2 keyN]
返回多个key的值,某个key不存在时返回nil
25 decr命令 decr key
对key对应的数字做减1 *** 作。如果key不存在,那么在 *** 作之前,这个key对应的值会被置为0。如果key有一个错误类型的value或者是一个不能表示成数字的字符串,就返回错误。
26 incr命令 incr key
对key对应的数字做减1 *** 作。如果key不存在,那么在 *** 作之前,这个key对应的值会被置为0。如果key有一个错误类型的value或者是一个不能表示成数字的字符串,就返回错误。
27 append命令 append key value
如果 key 已经存在,并且值为字符串,那么这个命令会把 value 追加到原来值(value)的结尾。 如果 key 不存在,那么它将首先创建一个空字符串的key,再执行追加 *** 作,这种情况 APPEND 将类似于 SET *** 作。返回append后字符串值(value)的长度。
31 SDS动态字符串
struct sdshdr {
unsigned int len;
unsigned int free;
char buf[];
}
其中,buf表示数据空间,用于存储字符串;len表示buf中已占用的字节数;free表示空闲的字节数。
32 新的SDS结构
增加了一个flags来标识类型,用一个字节(8位)来存储,前3位表示字符串的类型;剩余5位,存储长度小于32的段字符串。
创建 SDS 的大致流程是这样的:首先根据字符串长度计算得到 type,根据 type 计算头部所需长度,然后动态分配内存空间。
注意:① 创建空字符串时,SDS_TYPE_5 被强制转换为 SDS_TYPE_8(原因是创建空字符串后,内容可能会频繁更新而引发扩容 *** 作,故直接创建为 sdshdr8)
②长度计算有 +1 *** 作,因为结束符 \0 会占用一个长度的空间。
③返回的是指向 buf 的指针 s。
41 session共享
42 计数器(商品浏览记录)
43 访问限速
list类型用来存储多个有序的字符串,列表当中的每一个字符看做一个元素,一个列表当中可以存储有一个或者多个元素,redis的list支持存储2^32次方-1个元素。
Redis可以从两端push和pop元素,支持读取指定范围或者制定下表的元素。list是一种灵活的链式结构,可以充当队列或者栈的角色。
list的元素是有序的,且列表内的元素是可以重复的。
注意:Redis32以前,列表底层的编码是ziplist(压缩列表)和linkedlist(双向列表)实现的,因为双线列表占用的内存比压缩列表多,所以当创建新的列表键时,列表会优先考虑用压缩列表,只有在需要的时候才会转换到双向列表实现。32以后重新引入了一个quicklist,列表底层都是有quicklist实现,quicklist是一个由ziplist组成的双向列表,每个节点使用ziplist来存储数据。
21 Lpush命令 lpush key value
将一个或多个值插入到列表头部。 如果 key 不存在,则创建list,然后再插入数据 *** 作。 当 key 存在但不是列表类型时,返回一个错误。
22 Rpush命令 rpush key value
将一个或多个值从list的尾部插入
23 Blpop命令 blpop key seconds
Blpop是取出列表的第一个元素,如果list中没有元素则会一直等到到超时,或者发现有数据为止,seconds是指定多少秒返回。如没有数据,则返回nil。
同理,Bropo为移除list列表的最后一个元素
24 Linsert命令 linsert key before/after val1 val2
在list列表的某一个元素前或者后插入另外一个元素。当指的的元素不存在时,不执行任何动作。如果列表不存在时,视为空列表,不执行任何动作。
25 Lindex命令 lindex key index
通过链表的下标获取列表中的元素,可以是-1表示链表最后一个元素,-2代表倒数第二个元素,没有返回nil
26 Llen命令 llen key
返回list的长度,如果list不存在,返回0
27 Lrange命令
返回指定list区间内的元素,区间以偏移量start和end决定。其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
51 队列秒杀抢购
list类型的lpop和rpush(或者反过来,lpush和rpop)能实现队列的功能,故而可以用Redis的list类型实现简单的点对点的消息队列。不过不推荐在实战中这么使用,因为现在已经有Kafka、NSQ、RabbitMQ等成熟的消息队列了,它们的功能已经很完善了,除非是为了更深入地理解消息队列,不然没必要去重复造轮子。
52 排行榜
list类型的lrange命令可以分页查看队列中的数据。可将每隔一段时间计算一次的排行榜存储在list类型中。只有定时计算的排行榜才适合使用list类型存储,与定时计算的排行榜相对应的是实时计算的排行榜,list类型不能支持实时计算的排行榜。
以上就是关于怎样使用list 得到redis中的map类型数据全部的内容,包括:怎样使用list 得到redis中的map类型数据、深入了解Redis *** 作五大数据类型常用命令、搞懂Redis(二)-2:List数据结构等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)