0


Redis 字符串( String )

【一】简介

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 。

标签: redis 数据库 java

本文转载自: https://blog.csdn.net/FairyKunKun/article/details/128085907
版权归原作者 Fairy-KunKun 所有, 如有侵权,请联系我们删除。

“Redis 字符串( String )”的评论:

还没有评论