Redis——》数据类型:String(字符串)

推荐链接:
    总结——》【Java】
    总结——》【Mysql】
    总结——》【Redis】
    总结——》【Spring】
    总结——》【SpringBoot】
    总结——》【MyBatis、MyBatis-Plus】


相关链接:
    Redis——》数据类型
    Redis——》数据类型:string(字符串)
    Redis——》数据类型:hash(哈希)
    Redis——》数据类型:list(列表)
    Redis——》数据类型:set(集合)
    Redis——》数据类型:zset(有序集合)
    Redis——》数据类型:bitmap

Redis——》数据类型:string(字符串)

  • 一、简介
  • 二、应用场景
  • 三、底层结构
  • 四、内部编码方式
    • 1、获取编码方式
    • 2、改变编码方式
  • 五、格式化显示
  • 六、操作示例
    • 1、字符操作:set、get
      • (1)增
      • (2)删
      • (3)改
      • (4)查
    • 2)数值操作:incr、decr
    • 3)bitmap操作

一、简介

string是Redis最基础的数据结构类型,它是二进制安全的,可以存储图片或者序列化的对象,值最大存储为512M

二、应用场景

共享session、分布式锁,计数器、限流

三、底层结构

Redis——》数据类型:String(字符串)_第1张图片

struct sdshdr{ 
    unsigned int len; // 标记buf中已使用的空间长度 
    unsigned int free; //标记buf中未使用的空间长度
    char buf[]; // 存储的实际内容 
}

Q:Redis为什么选择SDS结构,而不选择C语言原生的char[]?
A:
举例,获取字符串长度
SDS中,可以直接获取len,时间复杂度为O(1)
C 中,需要遍历整个字符串,时间复杂度为O(n)

四、内部编码方式

  • 编码不影响数据存取
  • 一些方法会改变value编码方式
  • 如果是int,就不需要判断能不能转成数字,直接进行incr操作,可以提高速度
内部编码方式 描述
int 8字节长整型
embstr 小于等于39字节字符串
raw 大于39字节字符串

1、获取编码方式

set k1 1
set k2 中国
set k3 五星红旗迎风飘扬胜利歌声多么嘹亮

# 字节长度:1
strlen k1
# 字节长度:6
strlen k2
# 字节长度:48
strlen k3

# 编码方式:int
object encoding k1
# 编码方式:embstr
object encoding k2
# 编码方式:raw
object encoding k3

Redis——》数据类型:String(字符串)_第2张图片

2、改变编码方式

set k1 1
# 编码方式:int
object encoding k1

# 字符串拼接
append k1 1
# 编码方式:raw
object encoding k1

# 递增加1
incr k1
# 编码方式:int
object encoding k1

Redis——》数据类型:String(字符串)_第3张图片

五、格式化显示

# raw触发格式化
# 如果不加raw,redis只会识别asicc码,超出asicc就以16进制的方式显示
# 如果加上raw,redis就会触发编码级格式化,发现16进制且符合当前编码集规则,就从编码集中找到对应字符
redis-cli --raw

# 以utf-8存储,字节长度为3
set k2 中
get k2

# 以gbk存储,字节长度为2
set k3 中
get k3

Redis——》数据类型:String(字符串)_第4张图片

六、操作示例

1、字符操作:set、get

(1)增

语法 示例 描述
set key value [ex seconds] [px milliseconds] [nx|xx] set k1 xiaoxian
set k1 xiaoxian ex 10
set k1 xiaoxian px 1000
set k1 xiaoxian nx
set k1 xiaoxian xx
ex:多少秒过期
px:多少毫秒过期
nx:若不存在才创建
xx:若存在才覆盖
setex key seconds value setex k1 10 xiaoxian 多少秒过期
psetex key milliseconds value psetex k1 1000 xiaoxian 多少毫秒过期
setnx key value setnx k1 xiaoxian 若不存在才创建
mset key1 value1 [key2 value2…] mset k1 a k2 b 批量创建kv,已存在的会被更新
msetnx key1 value1 [key2 value2…] msetnx k1 a k2 b 批量创建kv,所有key不存在才会创建

(2)删

语法 示例 描述
del key1 [key2 key3…] del k1
del k2 k3 单个或批量删除数据

(3)改

语法 示例 描述
set key value [ex seconds] [px milliseconds] [nx|xx] set k1 xiaoxian
set k1 xiaoxianhao
同一个key,执行set命令更新数据
getset key value getset k1 xiaoxian 更新新的值,返回老的值
setrang key offset value setrang k1 0 aaa 从指定下标开始更新,下标从0开始
append key value append k1 aaaa 在字符串最后面追加子串

(4)查

语法 示例 描述
keys * keys * 查看所有key
get key get k1 查看指定key的值
mget key [key …] mget k1 k2 批量指定key的值
getrange key start end getrange k1 0 -1 截取指定下标范围的字符
strlen key strlen k1 查看字节长度
help @string

set k1 hello
get k1
# 设置新的值,返回老的值
getset k1 hello,everybody

# nx:只有key不存在的时候,才允许操作(只能新增)
set k1 ooxx nx
get k1

# xx:只有key存在的时候,才允许操作(只能更新)
set k2 hello xx
get k2

# 多个key操作
mset k3 a k4 b
mget k3 k4

# 原子性操作,只要其中一个key失败,整个失败
msetnx k2 c k3 d


# append:追加字符
append k1 " world"
get k1

# GETRANGE:截取字符,下标从0开始
# 截取6~10
GETRANGE k1 6 10
# 截取6~最后
GETRANGE k1 6 -1
# 截取开始~最后,也就是全部
GETRANGE k1 0 -1

#SETRANGE,覆盖字符
# 从下标6之后,覆盖为mashibing
SETRANGE k1 6 mashibing

# 字符串长度
# 以utf-8存储,字节长度为3
set k1 中
get k1
strlen k1

# 以gbk存储,字节长度为2
set k2 中
get k2
strlen k2

2)数值操作:incr、decr

使用场景:
抢购,秒杀,详情页,点赞,评论
优点:
对数据库的事务操作,完全由redis内存操作代替

如果key不存在,初始值为0:

  • 在incr之后值为1
  • 在incrby之后值为步长
  • 在decr之后值为-1
  • 在decrby之后其值为-1

如果value值不能转为整型,如hello:

  • 执行失败
  • 返回相应的错误信息 “(error) ERR value is not an integer or out of range”
语法 示例 描述
incr key incr k1 对指定key的value加1,递增步长默认1
incrby key increment incrby k1 2 对指定key的value加指定的步长
incrbyfloat key increment incrbyfloat k1 0.1 支持传浮点型的值,正数为增,负数为减
decr key decr k1 对指定key的value减1,递减步长默认1
decrby key increment decrby k1 对指定key的value减1,递减步长默认1
help incr

set k1 99
# 递增
incr k1
incrby k1 22

# 递减
decr k1
decrby k1 22

# 小数递增
incrbyfloat k1 0.5

3)bitmap操作

Redis——》数据类型:bitmap

你可能感兴趣的:(Redis,redis,string,数据类型)