Redis 字符串(Strings) 复习
- 陈大剩
- 2022-08-22 18:16:21
- 1201
介绍
字符串是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"