Redis基础数据类型——字符串类型
今天开始,对在项目中用到的Redis方面的指令、以及一些设计进行一些归纳总结。都是曾经用到的,因此无论是知识点和指令都不全面,但覆盖了大部分需求点,即都是最常用到的知识点。
主要分为两部分:一部分是标准的指令集,另一部分是关于Redis使用的一些设计点,比如之前的Redis-Lua相结合使用,就是对基础功能在项目中的运用。
类型
Redis的基础数据类型主要包括五种,这五种数据类型在实际应用中,都较为常见。
- String、字符串
- Hash(散列、哈希)
- List(列表)
- Set(集合)
- Zset(storted set有序集合)
字符串类型
字串符类型是最基本的数据类型,也是最常用的数据类型,可以存储任何形式的字符串数据、二进制数据,单个字符串类型可以存储最多512M的数据。
命令
设置及读取数据
SET key value
GET key
Redis中最常用、最简单的两个指令,分别用来做字符串的存储和读取。
SET a hello
# ok
GET a
# "hello"
字符串的赋值,可以存储任意类型的字符串,如果字符串有空格,需要使用引号扩起来。
SET a hello world
# (error) ERR syntax error
SET a "hello world"
# ok
GET a
# "hello world"
设置获取多个键值
MGET key [key ...]
MSET key value [key value ...]
MGET/MSET同GET/SET指令功能基本一致,只不过可以同时获取多个key的值或设置多组key-value。
MSET a 1 b 2 c 3
# ok
MGET a b
# 1) "1"
# 2) "2"
GET c
# "3"
数字递增
INCR key
当字符串为整数类型时,Redis提供了一个INCR的命令,用来让当前值递增,并返回递增后的值。该命令可用于统计站点访问量等数据。当键值不存在时,默认为0,第一次执行INCR返回值为1。该操作是原子操作。数据类型必须是整数,否则将会异常。
INCR a # 不存在a,默认值为0,第一次递增,a=1
# (integer) 1
INCR a
# (integer) 2
GET a
也可以通过设置a的初始整数,之后再次递增。
SET b 10
# ok
INCR b
# (integer) 11
通常情况下,可以借助Redis的INCR统计一些数据增长量,同时也可以借助该指令用来生产递增ID,可以是从1开始的数据库递增ID,用于分布式部署,可以解决数据库递增分表的问题。也可以在INCR的基础上添加一些前缀等,生成一定规则的递增ID。
增加数字指定步长
INCRBY key increment
INCRBY指令与之前的INCR命令一致,都是对key进行增加数值的操作,只不过INCR每次加1,而INCRBY指令,每次增加指定的数值increment
。该指令同INCR不同之处,必须传递increment参数,否则将报指令参数错误。
INCRBY a 10 # a不存在,默认为0,第一次增加数值为参数10,返回10
# (integer) 10
INCRBY a 3
# (integer) 13
减少数值
DECR key
DECRBY key decrement
DECR、DECRBY分别与INCR、INCRBY一一对应,其用法也是一致,只不过是将键对应的整数值递减,DECR每次调用递减一,DECRBY每次按指定的decrement进行递减。
GET a
# (integer) 13
DECR a
# (integer) 12
DECRBY a 5
# (integer) 7
增加浮点数
INCRBYFLOAT key increment
INCRBYFLOAT与INCRBY指令相类似,差异是INCRBYFLOAT递增一个浮点数。
INCRBYFLOAT b 1
# "1"
INCRBYFLOAT b 2.3
# "3.3"
向字符串末尾增加值
APPEND key value
APPEND指令用于向key对应的值末尾添加value值,如果key不存在,则同SET命令一致,如果key存在,则在其对应的值末尾添加value,返回值为添加后的字符串长度。
APPEND a redis
# (integer) 5
APPEND a " is cool"
# (integer) 13
GET a
# "redis is cool"
获取字符串长度
STRLEN key
STRLEN指令用于查询一个字符串key的值长度。当key不存在时返回0。中文每个字符长度为3。
GET a
# "redis is cool"
STRLEN a
# (integer) 13
GET b
# (integer) 0
SET b 中国
# ok
STRLEN b
# (integer) 6
获取子字符串
GETRANGE key start end
GETRANGE指令用于获取key字符串的子字符串,取值范围由start和end两个值确定,包括start、end本身所在索引位置。返回子字符串。从0开始。
SET a "hello world!"
# ok
GETRANGE a 1 6
# "ello w"
位运算
Redis提供位运算的功能,可以设置、读取字符串,指定位置上的位值。并提供了统计范围内的位值功能。
SETBIT key offset value
GETBIT key offset
BITCOUNT key [start] [end]
BITOP operation destkey key [key...]
SETBIT可以针对key,设置偏移位置offset的值为0或1(二进制)。当key不存在时,如果offset位置大于0,则除了设置offset位置为value外,小于offset的位置均被设置为默认值0。返回值为offset位置的旧值。
如果获取的offset超过了二进制的实际长度时,返回默认值0。
SETBIT a 100 1 # a不存在,100位被设置为1,其余被设置为0
# (integer) 0 # a不存在,默认都是0
SETBIT a 110 0
# (integer) 0
SETBIT a 100 0 # 返回旧值1
# (integer) 1
SETBIT a 111 1
# (integer) 0
GETBIT a 98 # setbit时,不存在,要设置的位置与起始位置中间均被设置为0
# (integer) 0
GETBIT a 111
# (integer) 1
BITCOUNT指令用于统计key字符串二进制位中,为1的数量。当start、end缺省时,统计整个key的数据,当传递start、end参数时,统计指定区域范围的1的数量。索引从0开始,描述的是字节,如0 1
标识前两个字节,一个字节8位。
# a不存在
SETBIT a 5 1
SETBIT a 15 1
SETBIT a 20 1
BITCOUNT a
# (integer) 3
BITCOUNT a 0 -1 # -1标识全部字节
# (integer) 3
BITCOUNT a 0 1 # 标识统计前两个字节
# (integer) 2
BITCOUNT a 1 2 # 统计第二个、第三个字节的为1数量
# (integer) 2
BITOP指令用于对多个字符串的key进行位运算,并将结果存储到destkey中。其支持的位运算主要有OR、AND、XOR和NOT。NOT参数只能对一个字符串进行操作,每次操作的是完整字节数,如只设置了前三位为1,则会补全一个字节8位,数据为:00000111,not运算后为:11111000
# a = 1011
# b = 0101
BITOP OR orKey a b # 1111
# (integer) 1
BITCOUNT orKey
# (integer) 4
BITOP AND andKey a b # 0001
# (integer) 1
BITCOUNT andKey
# (integer) 1
BITOP XOR xorKey a b # 1110
# (integer) 1
BITCOUNT xorKey
# (integer) 3
BITOP NOT notKey a # 1111 0100,一个字节
# (integer) 1
BITCOUNT notKey
# (integer) 5
字节运算很有用,因为其性能较高,如统计用户在一个月的登录天数,一个用户最多使用31位,登录标识为1,未登录默认为0,统计登录天数,只需要使用BITCOUNT即可,如果要实现登录月历,需要读取本月的个位为1的所有位置,标识即可。
当不存在时设置
SETNX key value # SET IF NOT EXIST
SETNX指令用来实现当key不存在时,设置key值为value。在实现分布式锁时,通常需要使用SETNX指令。
SETNX a 123 # a不存在,设置成功
# (integer) 1
SETNX a 345 # a存在,设置不成功
# (integer) 0
GET a
# "123"