1,redis对象的结构
type记录了对象的类型,可以使字符串,列表,哈希,集合和有序集合对象。
encoding记录的是type对象对应的底层实现,在redis中每种类型只有少两种底层实现的数据结构。通过不同的编码方式是redis可以根据不同的使用场景来选择不同的实现方式。同时不同编码在满足条件时会触发转换。
ptr是指向底层实现数据结构的指针。
2,字符串
字符串对象是使用最广泛的类型,如memcache中的kv的v相似。也是redis其他数据类型嵌套使用的对象类型。有三种编码方式:int、raw、embstr三种。
a, raw编码方式
字符串对象是大于39字节的字符串时则私用raw编码方式存储,即SDS。
b, smbstr编码方式
smbstr编码方式是专门保存短字符产的一种编码方式,与raw相似,但会调用一次内存分配函数申请redisobject和sdshdr,连续存储。但它是只读的,当对它修改时类型转换为raw编码方式。
c, int编码方式
ptr指向一个整数,当对已int编码方式编码的字符串对象进行append等操作时,会类型转换为sds类型。
d, 可进行的操作
在使用命令INCR系列( INCR, DECR, INCRBY)命令时将字符串作为的原子计数器。
使用APPEND命令追加字符串。
将字符串作为GETRANGE 和 SETRANGE的随机访问向量。
在小空间里编码大量数据, 或者使用 GETBIT 和 SETBIT创建一个Redis支持的Bloom过滤器。
e, 场景
String是最常用的一种数据类型,普通的key/value存储都可以归为此类,value其实不仅是String,
也可以是数字。
3,列表
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边) LPUSH 命令插入一个新的元素导头部, 而 RPUSH插入一个新元素导尾部.
redis的列表有两种实现方式ziplist和linkedlist,
a, ziplist编码方式
当元素数目小于512个并且每个元素的长度都小于64个字节时使用该编码方式。当插入的元素不满足上述条件则转换为linkedlist编码。
b, linkedlist是双端链表的实现
c, 场景分析
实现最新消息排行等功能。
Lists的另一个应用就是消息队列,可以利用Lists的PUSH操作,将任务存在Lists中,然后工作线程再用POP操作将任务取出进行执行。
从时间复杂度的角度来看Redis列表的主要特征是在头和尾的元素插入和删除是固定时间,即便是数以百万计的插入。. 在列表的两端访问元素是非常快的但是如果你试着访问一个非常大的列表的中间的元素是很慢的,因为那是一个O(N)操作。因此list不支持判断某个key是否在列表中这一命令。
4,哈希
在类似memcache中,结构化的信息打包成 hashmap,在客户端序列化后存储为一个字符串的值(一般是 JSON 格式),比如用户的昵称、年龄、性别、积分等。这时候在需要修改其中某一项时,通常需要将字符串(JSON)取出来,然后进行反序列化,修改某一项的值,再序列化成字符串(JSON)存储回去。操作复杂、也不便于更新修改操作,并发情况。hash完美解决。两种编码方式,ziplist和dict,一个ziplist存放了一个key对应的结构化数据。
a, ziplist编码方式
类似于列表,档大小和数量不满足时也会转换为dict编码。
b, dict编码
这里k和v都是字符串对象
c, 场景分析
存储、读取、修改用户的结构化数据
5,集合
Redis 集合(Set)是一个无序不重复的字符串集合. 你可以以O(1)的时间复杂度 (无论集合中有多少元素时间复杂度都是常量)完成添加,删除,以及测试元素是否存在。有两种编码方式intset和hashtable。
a, inset编码方式
所有元素都保存在整数集合中
b, 场景分析
多次添加相同的元素,最终在集合里只会有一个元素。因此在添加元素的时候无须检测元素是否存在。
一个Redis集合支持一些服务端的命令从现有的集合出发去进行集合运算,求交集、并集、差集
set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,不同于list,可以实现检查某一key是否在set中,因为底层是hashtable,常量复杂度。
实际应用如计算独立ip,微博共同好友,好友推荐等
6,有序集合
有序集合是将集合中的元素增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列,集合的成员是唯一的,但是评分可以是重复了。有序集合使用ziplist和skiplist+dict两种编码方式。
a, ziplist方式
第一个节点保存元素成员,相邻第二个节点保存score,编码方式类似于哈希的ziplist编码方式。
b, skiplist+dict编码方式
zset结构同时包含一个字典和一个跳跃表,skiplist保存了分支从小到大的所有元素,由于跳跃表的查找复杂度较高,因此使用dict结构存成员和分值,查找复杂度为O(1),而而zrank和zrange命令式则使用skiplist进行范围操作。
c, 场景分析
排行榜相关,使用ZADD命令去更新它,使用 ZRANGE命令来得到前多少名的用户,,使用ZRANK命令返回该用户的名词。同时使用ZRANK 和 ZRANGE 可以显示和给定用户分数相同的所有用户。
来做带权重的队列,如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。
score设为过期时间,需要精准设定过期时间,定期清除过期的数据。
使用有序集合你可以以非常快的速度(O(log(N)))添加,删除和更新元素。因为元素是有序的, 可以很快的根据评分或者次序来获取一个范围的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。在有序集合中,可以很快捷的访问一切需要的东西:有序的元素,快速的存在性测试,快速访问集合的中间元素。
相关推荐
三种命令模式Sync vs Async vs Fire-and-Forget最后,这里有三种命令模式分别对应 StackExchange.Redis的三类不同的使用场景。Sync,同步模式会直接阻塞调用者,但是显然不会阻塞其他线程。Async,异步模式直接走的是...
redis是一个key-value存储系统,value的类型包括string(字符串),list(链表),set(集合),zset(有序集合),hash(哈希类型)。为了保证效率,数据都是缓冲在内存中,在处理大规模数据读写的场景下运用比较多。 备注:...
面试题包括以下十九部分:Java 基础、容器、多线程、反射、对象拷贝、...184.redis 支持的数据类型有哪些? 185.redis 支持的 java 客户端都有哪些? 186.jedis 和 redisson 有哪些区别? 。。。。。。。。。。。。。
如何建立连接,发送不同消息数据类型 如何订阅,且消费不同消息数据类型 场景案例分析 介绍Springboot2【@scheduled定时器】的用法: 定时器计划用法介绍 开启并行多线程任务两种方式 场景案例分析 介绍Springboot2...
在Java基础方面,文档中涉及到了数据类型、循环语句、条件语句、类和对象、异常处理、线程等基础知识,这些都是Java编程必不可少的内容。在面试中,考官通常会从这些基础知识入手,检查应聘者是否掌握扎实,能否...
- 学习Java语言的基本语法、数据类型、运算符等基础知识。 - 理解面向对象编程的概念,掌握类、对象、继承、多态等相关知识。 - 学习异常处理、输入输出流、集合框架等Java核心库的使用。 2. Web开发阶段: - ...
熟悉Python的语法、数据类型、运算符等基本概念。 掌握函数、类、模块和包的概念,能够编写可复用的代码。 理解异常处理机制,编写健壮的代码。 2. 编程范式: 掌握面向对象编程(OOP)的概念,能够设计和实现类、...
【Redis】redis五种常见的数据类型详解 123 String字符串类型 124 List列表类型 126 Set集合类型 128 Hash散列类型 130 Redis的有序集合ZSet数据类型 131 【Redis】Redis的存储结构,或者说如何工作的,与mysql的...
4.3.1 Redis+Lua实现 76 4.3.2 Nginx+Lua实现 77 4.4 接入层限流 78 4.4.1 ngx_http_limit_conn_module 78 4.4.2 ngx_http_limit_req_module 80 4.4.3 lua-resty-limit-traffic 88 4.5 节流 90 4.5.1 throttleFirst/...
支持 Oracle RAD、高级队列和高级数据类型JPA - 简化创建 JPA 数据访问层和跨存储的持久层功能Mapping - 基于 Grails 的提供对象映射框架,支持不同的数据库Examples - 示例程序、文档和图数据库Guidance - 高级...
Java基础知识:数据类型、关键字、面向对象、集合框架、异常处理等 Java核心技术:I/O、多线程、网络编程、反射、泛型等 Java虚拟机:内存模型、垃圾收集器、类加载机制等 Java企业级开发:Spring、Hibernate、MyBatis等...
数据分析,优化链路:可以得到用户的行为路径,汇总分析应用在很多业务场景。 7、数据权限 利用基于Mybatis的DataScopeInterceptor拦截器实现了简单的数据权限 8、SaaS(多租户)的无感解决方案 使用Mybatis拦截器...
JDBC Extensions - 支持 Oracle RAD、高级队列和高级数据类型 JPA - 简化创建 JPA 数据访问层和跨存储的持久层功能 Mapping - 基于 Grails 的提供对象映射框架,支持不同的数据库 从之前发布其他chm文件下载用户...
XCMS提供了多种的缓存方式,包括数据缓存、静态缓存和查询缓存等,支持包括文件方式、APC、Db、Memcache、Shmop、Sqlite、Redis、Eaccelerator和Xcache在内的动态数据缓存类型,以及可定制的静态缓存规则,并提供了...
数据分析,优化链路:可以得到用户的行为路径,汇总分析应用在很多业务场景。 7、数据权限 利用基于Mybatis的DataScopeInterceptor拦截器实现了简单的数据权限 8、SaaS(多租户)的无感解决方案 使用Mybatis拦截器...
实现了基于 SQL mapping 来对数据结果集进行映射,是一种半自动化的模式,相比较于 O/R mapping 全自动化的模式。 因此,在 bearcat-dao 里,开发者能够对SQL进行完全的控制,通过SQL来与数据库打交道并进行性能优化...