Redis五种数据类型和通用指令:
-
Redis数据的存储格式:
- redis 自身是一个 Map,其中所有的数据都是采用 key : value 的形式存储
- 数据类型指的是存储的数据的类型,也就是 value 部分的类型,key 部分永远都是字符串
-
string类型的使用:
- string类型的介绍:
- 存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型
- 存储数据的格式:一个存储空间保存一个数据
- 存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用
- string类型的基本操作:
- 添加/修改数据
set key value
- 获取数据
get key
- 删除数据
del key
- 添加/修改数据
- string类型的添加/修改多个数据的操作
- 添加/修改多个数据
mset key1 value1 key2 value2 …
这里的m指的是Multiple[ˈmʌltɪpl]
- 获取多个数据
mget key1 key2 …
- 获取数据字符个数(字符串长度)
strlen key
- 追加信息到原始信息后部(如果原始信息存在就追加,否则新建)
append key value
上面的指令和 基本的使用指令相似这里不再详述- 需要注意的是append操作的是字符串类型虽然Redis中的字符串类型中要是纯数字类型的话能当做是数字进行加减 但是这里使用append不行 而是当做是字符串类型
- 需要注意的是append操作的是字符串类型虽然Redis中的字符串类型中要是纯数字类型的话能当做是数字进行加减 但是这里使用append不行 而是当做是字符串类型
- 添加/修改多个数据
- string类型的扩展操作:
- 设置数值数据增加指定范围的值:
incr key
将一个string类型的value增加一incrby key increment
将一个string类型的value增加指定的increment的整数incrbyfloat key increment
将一个string类型的value增加指定的increment的小数/整数
- 设置数值数据减少指定范围的值:
decr key
decrby key increment
- 注意:
- 没有decrbyfloat指令 要想使减少指定的范围的小数 使用incrbyfloat 指定负数即可
- 没有decrbyfloat指令 要想使减少指定的范围的小数 使用incrbyfloat 指定负数即可
- string 作为数值操作:
- string在redis内部存储默认就是一个字符串,当遇到增减类操作incr,decr时会转成数值型进行计算
- redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发
带来的数据影响。 - 按数值进行操作的数据,如果原始数据不能转成数值,或超越了redis 数值上限范围,将报错
9223372036854775807
(Java中long型数据最大值,Long.MAX_VALUE
)
- 设置数据具有指定的生命周期:
setex key seconds value
设定字符串类型的key生命周期 以秒为单位psetex key milliseconds value
设定字符串类型的key生命周期 以毫秒为单位
- Redis中数据类型操作的注意事项:
- 表示运行结果是否成功
- (integer) 0 → false 失败
- (integer) 1 → true 成功
- 表示运行结果值
- (integer) 3 → 3 3个
- (integer) 1 → 1 1个
- 数据未获取到**(nil)等同于null**
- 数据最大存储量512MB
- 数值计算最大范围**(java中的long的最大值)**
- 数据库中的热点数据key命名惯例:表明:主键名:主键值:字段名
- 表示运行结果是否成功
- 设置数值数据增加指定范围的值:
- string类型的介绍:
-
hash类型的使用:
- 为什么Redis会创建这样的数据类型:就是需求 需求推动功能(非常重要) string类型进行对象类数据的存储如果具有较频繁的更新需求操作会显得笨重 对象类型的数据可以使用json字符串进行存储 但是进行修改的时候比较笨重 于是就有了hash 类型
- hash 类型:
- 新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
- 需要的存储结构:一个存储空间保存多个键值对数据
- hash类型:底层使用哈希表结构实现数据存储
- hash存储结构优化
- 如果field数量较少,存储结构优化为类数组结构
- 如果field数量较多,存储结构使用HashMap结构
- hash 类型数据的基本操作:
- 添加/修改数据
hset key field value
- 获取数据
hget key field
或者hgetall key
见名知义前一种按照字段进行获取 后一种获取所有的字段 - 删除数据
hdel key field1 [field2]
- 添加/修改多个数据
hmset key field1 value1 field2 value2 …
- 获取多个数据
hmget key field1 field2 …
- 获取哈希表中字段的数量
hlen key
- 获取哈希表中是否存在指定的字段
hexists key field
- 添加/修改数据
- hash 类型数据扩展操作
- 获取哈希表中所有的字段名或字段值
hkeys key
hvals key
- 设置指定字段的数值数据增加指定范围的值
hincrby key field increment
hincrbyfloat key field increment
- 获取哈希表中所有的字段名或字段值
- hash 类型数据操作的注意事项:
- hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到,对应的值为(nil)
- 每个 hash 最多可以存储 232 - 1 个键值对
- hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用
- hgetall 操作可以获取全部属性,如果内部field过多,遍历整体数据效率就很会低,有可能成为数据访问瓶颈
- 为什么Redis会创建这样的数据类型:就是需求 需求推动功能(非常重要) string类型进行对象类数据的存储如果具有较频繁的更新需求操作会显得笨重 对象类型的数据可以使用json字符串进行存储 但是进行修改的时候比较笨重 于是就有了hash 类型
-
list类型的使用:
- list类型:
- 数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分
- 需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序
- list类型:保存多个数据,底层使用双向链表存储结构实现 操作起来像是Java中的双端队列
- list 类型数据基本操作: 像是双端队列 就能从两头进行数据的添加 和 删除
l就是从左端加入 r就是从右端加入
- 添加/修改数据
lpush key value1 [value2] …… rpush key value1 [value2] ……
- 获取数据
lrange key start stop
lindex key index
获取某个key中的index对应的值llen key
获取某个key中有多少个数据 - 移除并返回数据
lpop key rpop key
- 添加/修改数据
- list 类型数据扩展操作
- 规定时间内获取并移除数据:
blpop key1 [key2] timeout
brpop key1 [key2] timeout
brpoplpush source destination timeout
- 移除指定数据
lrem key count value
- 规定时间内获取并移除数据:
- list 类型数据操作注意事项:
- list中保存的数据都是string类型的,数据总容量是有限的,最多232- 1 个元素 (4294967295)。
- list具有索引的概念,但是操作数据时通常以队列的形式进行入队出队操作,或以栈的形式进行入栈出栈操作
- 获取全部数据操作结束索引设置为-1
- list可以对数据进行分页操作,通常第一页的信息来自于list,第2页及更多的信息通过数据库的形式加载
- list类型:
-
set类型的使用:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的 可以用Java中的HashMap 和 HashSet进行类比
-
set 类型数据的基本操作
- 添加数据
sadd key member1 [member2]
- 获取全部数据
smembers key
- 删除数据
srem key member1 [member2]
- 获取集合数据总量
scard key
- 判断集合中是否包含指定数据
sismember key member
- 添加数据
-
set 类型数据的扩展操作
- 随机获取集合中指定数量的数据
srandmember key [count]
- 随机获取集合中的某个数据并将该数据移出集合
spop key [count]
- 求两个集合的交、并、差集
sinter key1 [key2]
交集sunion key1 [key2]
并集sdiff key1 [key2]
差集
- 求两个集合的交、并、差集并存储到指定集合中
sinterstore destination key1 [key2]
sunionstore destination key1 [key2]
sdiffstore destination key1 [key2]
- 将指定数据从原始集合中移动到目标集合中
smove source destination member
- 随机获取集合中指定数量的数据
-
set 类型数据操作的注意事项
- set 类型不允许数据重复,如果添加的数据在 set 中已经存在,将只保留一份
- set 虽然与hash的存储结构相同,但是无法启用hash中存储值的空间
-
-
sorted_set 类型的使用:通过传入的score进行排序
-
sorted_set 类型数据的基本操作
- 添加数据
zadd key score1 member1 [score2 member2]
- 获取全部数据
zrange key start stop [WITHSCORES]
这样的方式是按照score升序排列 输出zrevrange key start stop [WITHSCORES]
这样的方式是按照score降序排列 输出
- 删除数据
zrem key member [member ...]
- 按条件获取数据
zrangebyscore key min max [WITHSCORES] [LIMIT]
min与max用于限定搜索查询的条件zrevrangebyscore key max min [WITHSCORES]
- 条件删除数据
zremrangebyrank key start stop
start与stop用于限定查询范围,作用于索引,表示开始和结束索引zremrangebyscore key min max
- 获取集合数据总量
zcard key
获取数据总量zcount key min max
获取score [min, max] 指定范围的 member的个数 注意的是只输出个数 想要数据 使用上面的指令进行获取
- 集合交、并操作
zinterstore destination numkeys key [key ...]
zunionstore destination numkeys key [key ...]
- 添加数据
-
sorted_set 类型数据的扩展操作
- 获取数据对应的索引(排名)
zrank key member
升序的索引zrevrank key member
降序的索引
- score值获取与修改
zscore key member
获取zincrby key increment member
修改
- 获取数据对应的索引(排名)
-
sorted_set 类型数据操作的注意事项
- score保存的数据存储空间是64位,如果是整数范围是-9007199254740992~9007199254740992
- score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时候要慎重
- sorted_set 底层存储还是基于set结构的,因此数据不能重复,如果重复添加相同的数据,score值将被反复覆盖,保留最后一次修改的结果
-
-
Redis中通用的指令:
- 获取当前系统时间
time
- key 基本操作
- 删除指定key
del key
从这里可以看出del指令不只能进行string类型的key的删除 - 获取key是否存在
exists key
- 获取key的类型
type key
- 删除指定key
- key 扩展操作(时效性控制)
- 为指定key设置有效期 进行时效性控制在以后的分布式锁中还有使用 以后在进行详细的解释
expire key seconds
pexpire key milliseconds
以毫秒为单位expireat key timestamp
时间参数是 UNIX 时间戳(unix timestamp)秒为单位pexpireat key milliseconds-timestamp
- 获取key的有效时间
ttl key
获取存活时间秒为单位 time to live 学过计网的肯定不陌生pttl key
毫秒为单位
- 切换key从时效性转换为永久性
persist key
注意两点 :1 对永久性的key进行此操作会报错 2 没有的key也是如此
- 查询key
keys pattern
- 查询模式规则:
- * 匹配任意数量的任意符号 由于Redis的单线程执行命令的特征 在key非常的多的时候会造成较长时间的阻塞 不建议在线上使用
- ? 配合一个任意符号
- [] 匹配一个指定符号
- key 其他操作
- 为key改名
rename key newkey
将key名称改成 newkey 可能会将原有的key进行覆盖
renamenx key newkey
仅当 newkey 不存在时,将 key 改名为 newkey nx :not exists
- 对所有key排序
sort
- 其他key通用操作
help @generic
查手册
- 为key改名
- 查询模式规则:
- 为指定key设置有效期 进行时效性控制在以后的分布式锁中还有使用 以后在进行详细的解释
- 获取当前系统时间