【一】简介
String 是 Redis 最基本的数据类型,你可以理解成 Memcache 一模一样的类型,一个 key 对应一个 value 。
String 类型是二进制安全的。意味着 Redis 的 String 可以包含任何数据。比如 jpg 图片或者序列化对象。
String 类型是 Redis 最基本的数据类型,一个 Redis 中字符串 value 最多可以是512M。
【二】常用命令
127.0.0.1:6379> flushdb
OK
清空当前的数据库
127.0.0.1:6379> keys *
(empty array)
查看一下,当前库里面,什么也没有
127.0.0.1:6379> set k1 v100
OK
127.0.0.1:6379> set k2 v200
OK
往里面加了两个数据
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
查看一下当前数据库有什么内容
127.0.0.1:6379> get k1
"v100"
取 k1 对应的值
127.0.0.1:6379> set k1 v1100
OK
127.0.0.1:6379> get k1
"v1100"
改变 k1 的值,并查看 k1 对应的值是否发生改变
127.0.0.1:6379> append k1 abc
(integer) 8
127.0.0.1:6379> get k1
"v1100abc"
在 k1 的后面接上 abc ,返回 k1 的长度变成了8,取得 k1 的值,确实得到了印证
127.0.0.1:6379> strlen k1
(integer) 8
获取 k1 的长度,为8
127.0.0.1:6379> setnx k2 v2200
(integer) 0
127.0.0.1:6379> get k2
"v200"
127.0.0.1:6379> setnx k3 v300
(integer) 1
127.0.0.1:6379> get k3
"v300"
setnx k 只在 k 存在的时候才会给 k 赋值,否则不会进行这个操作
127.0.0.1:6379> set k4 4
OK
127.0.0.1:6379> incr k4
(integer) 5
127.0.0.1:6379> get k4
"5"
127.0.0.1:6379> decr k4
(integer) 4
127.0.0.1:6379> get k4
"4"
127.0.0.1:6379> incr k5
(integer) 1
127.0.0.1:6379> get k5
"1"
127.0.0.1:6379> decr k5
(integer) 0
127.0.0.1:6379> decr 5
(integer) -1
127.0.0.1:6379> decr k6
(integer) -1
incr k 使存储的数字值增1,只能对数字进行操作,如果为空,新增为1
decr k 使存储的数字值减1,如果为空,为-1
补充: incrby / decrby k 2 的意思是将 key 中存储的数字值增减。自定义步长。
【三】原子性
INCR key
起始版本:1.0.0
时间复杂度: O (1)
对存储在 key 的数值执行原子的加1操作。
所谓原子操作是指不会被线程调度机制打断的操作;
这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)
(1)在单线程中,能够在单条指令中完成的操作可以认为是“原子操作”, 因为中断只能发生于指令之间。
(2)在多线程中,不能被其它进程(线程)打断的操作就叫原子操作。
Redis 单命令的原子性主要得益于 Redis 的单线程。
案例
java 中的 i ++ 是否是原子操作?
i = 0 ;两个线程分别对 i 进行++100次,值是多少?
不是
答案不确定,最大值200,最小值是2
第一个线程跑了99次,然后突然被第二个打断了,第二个取值为1,然后,第一个取值为1,第二个跑完,第一个执行最后一步,2
【四】 进阶指令
mset k1 v1 k2 v2 ...
同时设置一个或多个 key-value 对
mget k1 k2 ...
同时获取一个或多个 value
msetnx k1 v1 k2 v2 ...
同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在
因为原子性,有一个失败则都失败
getrange key 0 3
获取值得范围,其实就是截串,截取第0位到第3位
setrange key 2 value
从 key 的第2位开始,覆盖 key 的值
setex age 20 value
设置 age 的值为 value ,过期时间为20秒
ttl age
查看 age 距离过期时间还有多少秒
get name jack
将 name 的值换成 jack
【五】数据结构
String 的数据结构为简单动态字符串( Simple Dynamic String ,缩写 SDS)。是可以修改的字符串,内部结构实现上类似于 Java 的 ArrayList ,采用预分配冗余空间的方式来减少内存的频繁分配。
当字符串的长度小于1 M 时,扩容都是加倍现有的空间,如果超过1 M ,扩容时一次只会多扩容1 M 的空间。需要注意的是字符串的最大长度为512 M 。
版权归原作者 Fairy-KunKun 所有, 如有侵权,请联系我们删除。