陈大剩博客

Redis 字符串(Strings) 复习

  • 陈大剩
  • 2022-08-22 18:16:21
  • 626

介绍

字符串是Redis最简单的储存类型,它存储的值可以是字符串、整数或者浮点数,对整个字符串或者字符串的其中一部分执行操作;对整数或者浮点数执行自增(increment)或者自减(decrement)操作。

Redis的字符串是一个由字节组成的序列,采用预分配冗余空间的方式来减少内存的频繁分配,内部为当前字符串实际分配的空间capacity 一般要高于实际字符串长度len。当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过1M,扩容时一次只会多扩1M的空间。需要注意的是字符串最大长度为512M。

应用场景

字符串类型在工作中使用广泛,主要用于缓存数据,提高查询性能。比如存储登录用户信息、电商中存储商品信息、可以做计数器(想知道什么时候封锁一个IP地址(访问超过几次))等等。

数据结构

的字符串是动态字符串,是可以修改的字符串,内部结构如图中所示,内部为当前字符串实际
字符串结构

字符串创建

创建单条(SET)

# SET key value [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp] [NX|XX] [GET]

# 过期时间(可选参数) [EX(秒) |PX(毫秒) |EXAT(时间戳) |PXAT(毫秒时间戳) ]
# 是否设置 [NX(不存在时设置)|XX(存在时设置)]
# [GET] 是否同时获取旧值

> SET test 'hello  word'
OK

# 设置过期时间为100s
> SET test1 'hello word' ex 100 
OK

# 重复设置将会更新值和过期时间

> SET test 'hello c69p.com' get
"hello word"

# 存在时设置,同时获取旧值
> SET test 'chendasheng' xx get
"hello c69p.com"

创建多条(MSET、MSETNX)

# 设置多个键的字符串值
# MSET key value [key value ...]
> MSET test2 "is test2" test3 "is test3"
OK

#  设置多个键,不存在时,设置字符串值
# MSETNX key value [key value ...]
> MSET test4 "is test4" test5 "is test5"
OK

键不存在时,设置字符串值(SETNX)

# 键不存在时,设置字符串值
# SETNX key value
> SETNX test6 "a"
(integer) 1

创建时同时设置生存时间(SETEX、PSETEX)

# 设置生存时间(秒为单位),同时设置值,存在则覆盖
# SETEX key seconds value (秒) | PSETEX key milliseconds value (毫秒)
> SETEX test7 100 "is test7"
OK

替换指定的key(SETRANGE)

# 覆盖给定 key 所储存的字符串值
# SETRANGE key offset value
> SETRANGE test6 0 "chendasheng"
(integer) 11

创建多条是原子操作,一条不成功则所有的都不成功。

查询

查询单条(GET、GETSET)

# 存在则返回,不存在返回nil
# GET key 
> GET test6
"chendasheng"

# 获取(旧)值并设置新值
# GETSET key value
> GETSET test6 "im test6"
"chendasheng"

查询多条(MGET)

# MGET key [key ...]
> MGET test1 test6
1) (nil)
2) "im test6"

查询长度(STRLEN)

# STRLEN key
> STRLEN test6
(integer) 8

查询key类型(TYPE)

# TYPE key
> TYPE test6
string

其他操作

步减/步增(INCR、INCRBY、INCRBYFLOAT、DECR、DECRBY)

# 数字值增一,不存在则新建一个
# INCR key
> INCR num
(integer) 1

# 自增增量值(increment)
# INCRBY key increment
> INCRBY num 10
(integer) 11

# 自增增量值浮点(increment)
# INCRBYFLOAT key increment
> INCRBY num 10.1
(integer) 22.1

# 数字值减一,不存在则新建一个
# DECR key
> DECR num1
(integer) -1

# 自减减量值(increment)
# DECRBY key increment
> DECRBY num1 10
(integer) -11

追加字符(APPEND)

# 追加值
# APPEND key value
> APPEND test6 1
(integer) 9

特殊string类型(bitmap)

bitmap并不是Redis一种数据结构,实际上它就是字符串,但是可以对字符串的位进行操作。bitmap一套命令。可以把bitmap想象成一个以bit为单位的数组,数组的每个单元存储0和1,数组的下标叫做偏移量

新建(SETBIT)

# offset 偏移量 value值
# SETBIT key offset value
> SETBIT bittest 0 1
(integer) 0

获取(GETBIT)

# offset 偏移量
# GETBIT key offset
> GETBIT bittest 0
(integer) 1

统计(BITCOUNT、BITPOS)

用于统计字符串被设置为1的bit数

统计指定范围为1的数量(BITCOUNT)

# 统计一个字符区间内为1的个数
# BITCOUNT key [start end]
> BITCOUNT bittest
(integer) 1

BITCOUNT是以字符为(Byte)单位,一个字符有8位bit

查找指定范围出现的第一个0或1(BITPOS)

查找指定范围出现的第一个0或1的bit位置

# bit查找的值 0 或者 1 [start] [end] 开始结束范围
# BITPOS key bit [start] [end]
> BITPOS test 1 0
(integer) 1

进行位元操作,并保存结果(BITOP)

  • ITOP AND destkey key [key …],对一个或多个key求逻辑并,并将结果保存到destkey
  • BITOP OR destkey key [key …],对一个或多个key求逻辑或,并将结果保存到destkey
  • BITOP XOR destkey key [key …],对一个或多个key求逻辑异或,并将结果保存到destkey
  • BITOP NOT destkey key ,对给定key求逻辑非,并将结果保存到destkey
# 对每bit进行运算
# BITOP operation destkey key [key ...]
> set key1 aa
OK
> set key2 bb
OK
> bitop and dest key1 key2
(integer) 2
> get dest
"``"
> bitop or dest key1 key2
(integer) 2
> get dest
"cc"

引用

Redis 爱好者-字符串

分享到:
0

说点儿什么吧

头像

表情

本站由陈大剩博客程序搭建 | 湘ICP备2023000975号| Copyright © 2017 - 陈大剩博客 | 本站采用创作共用版权:CC BY-NC 4.0

站长统计| 文章总数[109]| 评论总数[9]| 登录用户[22]| 时间点[112]

logo

登入

社交账号登录