
内存的读写速度很快
Epoll 模型
常用的五大Redis的数据结构,及他们各自的底层实现结构
string hash list set sortset(zset)
string 的底层实现是 简单动态字符串(SDS -simple dynamic string)
hash 的底层实现是 hash表 或则 压缩列表(ziplist)
list 的底层实现是 双向列表(quicklist) 或者 压缩列表
set 的底层实现是 hash表(hashtable) 或者 整数数组
sortset(zset) 的底层实现是 压缩列表 或者 跳表
各个数据结构的底层实现概览
value是 string 类型的时候分为三种情况
(1)、当设置的值是整数类型的时候,redis底层会将 string 类型转化为 int 来存储
(2)、设置的值小于等于44个字节的时候,使用的编码是 embstr
(3)、设置的值大于44个字节的时候,使用的编码是 raw
redis是用C语言编写的,在C语言中 string 类型是用字符数组 char[] 来实现的。redis实现字符串的底层并没有直接使用C语言中的字符数组的形式,而是进行了改造,构造出了一种SDS的数据结构
list的底层使用 快速双向链表quicklist 或者 压缩链表ziplist 来实现的。
list的底层并没有使用传统的双向链表的结构是因为
(1)、双向链表需要有一个 前指针 和 后指针 ,每个指针占用的空间分别都是8byte, 占用内存 比较多
(2)、双向链表所通用的一个问题是会形成很多的 内存碎片
压缩链表 ziplist 结构是
快速双向链表 quicklist 结构
hash的底层实现为 hashtable 或者 ziplist 。
hashtable的底层实现
当数据量比较小或者单个元素的时候,底层使用的是ziplist存储,具体可以通过配置来制定
1、 hashtable 是无序的 ziplist 是有序的
2、在能使用 hash 的情况下优先使用 hash ,不要使用 String ,因为使用太多的 String ,则会创建出过多的 key ,当 key 大量的时候,就会容易发生 hash碰撞 ,所以就需要频繁的 rehash ,每次 rehash 就会创建2倍的内存,造成内存浪费
hash的底层实现为 整数数组intset 或者 hashtable 。
当set都为整数的时候,set的底层实现都是使用 intset 结构实现
如果set中存在字符串的值,则使用 hashtable 来实现
intset 是有序的, hashtable 是无序的
sortset 底层使用 压缩列表ziplist 或 跳表skiplist 的结构实现
当数据量小的情况下,使用 ziplist 实现,当数据量大的情况下使用 ziplist 实现,具体可以通过配置设置
默认设置下的底层结构
skiplist 的底层实现
查找对应元素的时候,先从最高的索引层找,例如找c 150,则先从L1找,L1的指针指向b,查看b120小于150,则继续往后找,b的指针指向null,则向下一层找,向下一层b的指针指向c,查看c的score为150,所以找到对应的元素c
1、 >
任何兼容Redis协议的客户端都可以访问云数据库Redis实例,建议使用移动云推荐的方式,比如移动云Jedis客户端,避免出现某些命令不支持的问题。同时,云数据库Redis目前仅支持移动云内网访问。此外,在连接Redis时,如果经常出现固定时间连接超时,有可能是因为一些中间件设置了超时时间(如nginx、haproxy),导致应用在固定时间不连接Redis后,连接被中间件主动断开,此时可以选择定时连接一次Redis或者增大中间件超时时间,防止连接主动断开。在“狂欢双11,「移」价到底”这一活动中,新用户可以领取云数据库Redis的3折优惠券,订购更优惠。了解移动云云数据库Redis更多详情,欢迎注册登录移动云官网→>
在windows系统下安装多个Redis实例。服务器装有一个Redis实例,随着项目的进行,需要安装多个实例才可以。直接安装是只会有6379端口,需要采用下面的方式来安装。本示例讲解的是:redis-246-setup-64-bitexe 和redis-2817 windows MSOpen。工具/原料
Redis安装文件
CMD命令提示符
方法/步骤
下载安装文件,选择稳定版本
点击安装exe文件,进行安装。选择好路径,一直到安装结束即可。
点击Service查看Redis服务是否正确的安装。Windows--》Servicemsc。默认的端口为6379。服务已启动。
使用客户端工具进行连接,出现如下画面即成功。
使用CMD工具,安装另一个Redis实例服务,端口为6369 需要提前建好6369端口使用的conf文件
如:C:\Users\Gray>E:\redis-2817\redis-serverexe --service-install E:\redis-2817\redis6369conf --service-name RedisServer6369 --port 6369
试验了几次都没有提示成功的信息,但是查看服务成功了,而且用客户端连接也成功了。
查看6369端口的redis服务
步骤阅读
7
使用客户端连接6369 redis服务,出现如下界面表示成功
是。在redis连接时间中,是网络原因的设置,所以是3s经常超时的。Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
1在配置项中定义:
12345'SESSION_TYPE' => 'Redis', //session保存类型'SESSION_PREFIX' => 'sess_', //session前缀'REDIS_HOST' => '127001' //REDIS服务器地址'REDIS_PORT' => 6379, //REDIS连接端口号'SESSION_EXPIRE' => 3600, //SESSION过期时间
2在ThinkPHP\Library\Think\Session\Driver目录下新建Redisclassphp文件
文件内容如下:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162<phpnamespace Think\Session\Driver;class Redis {// Redis连接对象 private $redis;// Session过期时间 private $expire; / 打开方法 @param type $path @param type $name @return type / public function open($path, $name) { $this->expire = C('SESSION_EXPIRE') C('SESSION_EXPIRE') : ini_get('sessiongc_maxLifetime'); $this->redis = new Redis(); return $this->redis->connect(C('REDIS_HOST'), C('REDIS_PORT')); } / 关闭 @return type / public function close() { return $this->redis->close(); } / 读取 @param string $id @return type / public function read($id) { $id = C('SESSION_PREFIX') $id; $data = $this->redis->get($id); return $data $data : ''; } / 写入 @param string $id @param type $data @return type / public function write($id, $data) { $id = C('SESSION_PREFIX') $id; return $this->redis->set($id, $data, $this->expire); } / 销毁 @param string $id / public function destroy($id) { $id = C('SESSION_PREFIX') $id; $this->redis->delete($id); } / 垃圾回收 @param type $maxLifeTime @return boolean / public function gc($maxLifeTime) { return true; }}
memcached的方法和Redis差不多一样!
String、Hash、List、Set和Zset。
等同于java中的, Map<String,String> string 是redis里面的最基本的数据类型,一个key对应一个value。
应用场景 :String是最常用的一种数据类型,普通的key/value存储都可以归为此类,如用户信息,登录信息和配置信息等;
实现方式 :String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr、decr等 *** 作(自增自减等原子 *** 作)时会转成数值型进行计算,此时redisObject的encoding字段为int。
Redis虽然是用C语言写的,但却没有直接用C语言的字符串,而是自己实现了一套字符串。目的就是为了提升速度,提升性能。 Redis构建了一个叫做简单动态字符串(Simple Dynamic String),简称SDS。
Redis的字符串也会遵守C语言的字符串的实现规则,即 最后一个字符为空字符。然而这个空字符不会被计算在len里头。
Redis动态扩展步骤:
Redis字符串的性能优势
常用命令 :set/get/decr/incr/mget等,具体如下;
ps:计数器(字符串的内容为整数的时候可以使用),如 set number 1。
补充:
等同于java中的: Map<String,Map<String,String>> ,redis的hash是一个string类型的field和value的映射表, 特别适合存储对象。 在redis中,hash因为是一个集合,所以有两层。第一层是key:hash集合value,第二层是hashkey:string value。所以判断是否采用hash的时候可以参照有两层key的设计来做参考。并且注意的是, 设置过期时间只能在第一层的key上面设置。
应用场景 :我们要存储一个用户信息对象数据,其中包括用户ID、用户姓名、年龄和生日,通过用户ID我们希望获取该用户的姓名或者年龄或者生日;
实现方式 :Redis的Hash实际是内部存储的Value为一个HashMap,并提供了直接存取这个Map成员的接口。如,Key是用户ID, value是一个Map。 这个Map的key是成员的属性名,value是属性值 。这样对数据的修改和存取都可以直接通过其内部Map的Key(Redis里称内部Map的key为field), 也就是通过 key(用户ID) + field(属性标签) 就可以 *** 作对应属性数据。 当前HashMap的实现有两种方式 :当HashMap的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,这时对应的value的redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时redisObject的encoding字段为int。
常用命令 :hget/hset/hgetall等,具体如下:
等同于java中的 Map<String,List<String>> ,list 底层是一个链表,在redis中,插入list中的值,只需要找到list的key即可,而不需要像hash一样插入两层的key。 list是一种有序的、可重复的集合。
应用场景 :Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现;
实现方式 :Redis list的实现为一个 双向链表 ,即可以支持反向查找和遍历,更方便 *** 作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括 发送缓冲队列 等也都是用的这个数据结构。
常用命令 :lpush/rpush/lpop/rpop/lrange等,具体如下:
性能总结 :
它是一个字符串链表,left、right都可以插入添加。
等同于java中的 Map<String,Set<String>> ,Set 是一种无序的,不能重复的集合。并且在redis中,只有一个key它的底层由hashTable实现的,天生去重。
应用场景 :Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动去重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且 set提供了判断某个成员是否在一个set集合内的重要接口 ,这个也是list所不能提供的;如保存一些标签的名字。标签的名字不可以重复,顺序是可以无序的。
实现方式 :set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。
常用命令 :sadd/spop/smembers/sunion等,具体如下:
ZSet(Sorted Set:有序集合) 每个元素都会关联一个double类型的分数score,分数允许重复,集合元素按照score排序( 当score相同的时候,会按照被插入的键的字典顺序进行排序 ),还可以通过 score 的范围来获取元素的列表。
应用场景 :Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以 通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。 当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构,比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。
底层实现 : zset 是 Redis 提供的一个非常特别的数据结构,常用作排行榜等功能,以用户 id 为 value ,关注时间或者分数作为 score 进行排序。实现机制分别是 zipList 和 skipList 。规则如下:
zipList:满足以下两个条件
skipList:不满足以上两个条件时使用跳表、组合了hash和skipList
为什么用skiplist不用平衡树?
主要从内存占用、对范围查找的支持和实现难易程度这三方面总结的原因。
拓展:mysql为什么不用跳表?
常用命令 :zadd/zrange/zrem/zcard等;
官网地址: >
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
下载
官网下载:>
以上就是关于4、Redis高性能的根本原理全部的内容,包括:4、Redis高性能的根本原理、如何在 Go 语言中使用 Redis 连接池、使用什么客户端可以连接云数据库Redis实例等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)