持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情
🍊作者简介:少年不想说话,努力长大
🍊往期回顾:从零开始Redis(二)
🍊近期目标:写完基础源码,点赞👍🏼、收藏⭐、留言📩
上讲我们说了Redis的String类型的一些特性,今天我们继续看看redis的数据结构!!!
接着上讲的String类型说,上讲我们说了它的用法,现在我们说下它的结构;我喜欢这种先用再了解原理的做法。
首先String类型的全称是Simple Dynamic String简单动态串,它的内部结构我百度了一下是类似于ArrayList的结构,它采用预分配冗余空间的方式来减少内存的频繁分配,这里我提下之前的二进制安全性,我们知道redis基于C,这带来了\0结尾带来的二进制安全性问题,所以我们的Redis最终用了一个自己的类型来规避这个问题,这个类型就是SDS,规避的方式从C的\0变成了SDS的判断字段长度的方式;至于SDS的数据结构有机会大家自行深入,说到这再来说下它的原子性,
原子性
我们都知道Redis它是单线程的,即使现在有了I/O多路复用,在读取和写入进行了多线程操作但是我们要知道最关键的执行命令那里的单线程操作,所谓原子性就是单线程从始至终的运行或者多线程中进行的操作不被其他线程打断的操作,我们的Redis的原子性正是单线程的从一而终;这在上讲也有所体现;
String常见用法
此处补充上节的一些命令,包括追加,计算长度,求和,求差,替换值并返回旧值,看用例
127.0.0.1:6379> set item myRedis
OK
127.0.0.1:6379> get item
"myRedis"
追加
127.0.0.1:6379> APPEND item love
(integer) 11
127.0.0.1:6379> get item
"myRedislove"
求长度
127.0.0.1:6379> STRLEN item
(integer) 11
如果不存在该key则重新设置值
127.0.0.1:6379> setnx item RedisChg
(integer) 0
127.0.0.1:6379> get item
"myRedislove"
127.0.0.1:6379> set iNum 12
OK
递增1
127.0.0.1:6379> INCR iNum
(integer) 13
增加指定长度
127.0.0.1:6379> INCRBY iNum 13
(integer) 26
非数字类型报错
127.0.0.1:6379> decr item
(error) ERR value is not an integer or out of range
127.0.0.1:6379> decr iNum
(integer) 25
127.0.0.1:6379> decrby iNum 12
(integer) 13
设置新值同时获得旧值
127.0.0.1:6379> GETSET item MyNew
"myRedislove"
127.0.0.1:6379> get item
"MyNew"
以上就是String类型的一些概念和用法,我觉得常见的用法我都已经写上了,这里要补一句,在Redis的使用上我们要注意Redis的序列化,有些项目可能存在多种的bean,导致我们会错误选取,导致最后逻辑反序列化的时候出现乱码,又或者说存入redis序列化的时候就乱码了,所以我们在使用时要注意这里🥗🥗🥗;
结束结束,那就🛴🛴🛴
如果对你有所帮助
点个赞呗