七天玩转Redis | 第七天
这里分享一个之前自己总结的点:
1.Redis中字符串的数据结构
- Redis是用C语言写的,C语言中定义一个字符串:char data[ ] = "hello",但Redis没有直接使用C语言的字符数组来表示字符串,而是自己定义了SDS(Simple Dynamic String)的数据结构,这是Redis中的字符串类型。
-
为什么要用SDS?
-
C语言中在读取字符数组时,会读到char data[ ] = "hello\0"停止。而Redis作为缓存中间件,会接收到各种语言的数据,java、php、go等,而且读取是从socket中读取,如果一个字符串是"hello\0world",就会出现读到\0就结束的问题,导致数据出现丢失
-
-
SDS的特点
-
1. 二进制安全的数据结构(len)
-
SDS在字符数组的基础上,加了个len的字段表示数组的字节数,每次读取都会读到len表示的字节数为止,防止了数据丢失。
-
-
2. 内存预分配机制,避免了频繁的内存分配(free)
-
SDS中的free字段表示这个数组剩余的空间,例如:
SDS:free:0 len:5 char data[ ] = "hello";
现在要存放"helloworld"的字符串,剩余空间不足,就会进行扩容。
len:5 addlen:5 (len+addlen)* 2 = 20
SDS:free:10 len:10 char data[ ] = "helloworld";
会以所需空间2倍的方式进行扩容,但当数据的字节数达到1M(1024*1024)就不会再成倍扩容,只会再分配1M空间
-
-
3. 兼容C语言的函数库
-
在字符数组的末尾会添加 \0 ,兼容C语言的函数库
-
-
相关推荐
Redis ‘MISCONF Redis is configured to save RDB snapshots, but is currently not able to …’持久化问题
Redis遇到了报错:MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error. 从翻译上来看Redis被配置为保存RDB快照,但目前无法在磁盘上持久存储。 解决过程: 1、所以我上网查找解决办法,修改建议最多的是修改配置文件或者在redis-cli命令里
基于PHP56与Redis缓存技术构建的高效商城订单管理系统_包含用户登录模块七天免登录Session机制Token验证访问RBAC权限控制超级用户后台管理商品库存修改.zip
基于PHP56与Redis缓存技术构建的高效商城订单管理系统_包含用户登录模块七天免登录Session机制Token验证访问RBAC权限控制超级用户后台管理商品库存修改.zip
使用Redis实现用户积分排行榜的教程
排行榜功能是一个很普遍的需求。使用 Redis 中有序集合的特性来实现排行榜是又好又快的选择。 一般排行榜都是有实效性的,比如“用户积分榜”。如果没有实效性一直按照总榜来排,可能榜首总是几个老用户,对于新用户来说,那真是太令人沮丧了。 首先,来个“今日积分榜”吧,排序规则是今日用户新增积分从多到少。 那么用户增加积分时,都操作一下记录当天积分增加的有序集合。 假设今天是 2015 年 04 月 01 日,UID 为 1 的用户因为某个操作,增加了 5 个积分。 Redis 命令如下: ZINCRBY rank:20150401 5 1 假设还有其他几个用户也增加了积分: ZINCRBY
JavaEE电商项目8天速成
一个完整的JavaEE项目流程,其中包含代码
Java面试七天速通-八股文速记
内容概要: 坚持 7 天,短期内快速复习。 每天 10 题,弥补后端八股知识缺漏。 适用人群: 正在找工作,对于后端面试考核点缺少了解的人。 希望在 7-14 天 内准备后端面试,需要速查速记高频考点。 使用场景及目标: 跟着章节走,每天坚持每天进步。 将本资源用作面试突击小册,随时翻阅。 7 天完成面试突击,熟练掌握后端的高频考点,后端面试更有把握。


