Redis数据类型
#查找错误日志
$ docker logs myredis
#使用docker开启容器后,进入容器执行redis客户端
$ docker exec -it myredis redis-cli
#开启容器后,进入redis-benchmark 是一个压力测试工具 进行测试
$ docker exec -ti 24d68d(容器id) redis-benchmark
数据存储类型
存储类型 | 代表 |
---|---|
字符串类型 | string |
列表类型 | list |
散列类型 | hash |
集合类型 | set |
有序集合类型 | sorted_set |
字符串类型 string
- 存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型;
- 存储数据的格式:一个存储空间保存一个数据;
- 存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用;
# 添加/修改数据 set key value
$ set name wmj
# 获取数据 get key
$ get name
# 判断当前的key是否存在
$ exists name
# 设置key的过期时间,单位是秒
$ expire name 20
# 查看当前key的剩余时间
$ ttl name
# 查看当前key的一个类型!
$ type age
# 删除数据 del key
$ del name
# 添加/修改多个数据 mset key1 value1 key2 value2 … Multiple
$ mset age 10 address 河南
# 获取多个数据 mget key1 key2 …
$ mget age address
# 获取数据字符个数(字符串长度)strlen key
$ strlen name
# 追加信息到原始信息后部(如果原始信息存在就追加,否则新建) append key value
$ append name pf
######################################
# 设置数值数据增加指定范围的值 incr key 执行原子的加1操作
$ set number 5
# 5+1 自增1
$ incr number
# incrby key increment 将key对应的数字加decrement
# 6+4 设置步长 指定增量
$ incrby number 4
# incrbyfloat key increment 指定浮点数key来增长浮点数(存放于string中)的值
# 10+0.1
$ incrbyfloat number 0.1
# 设置数值数据减少指定范围的值
# decr key
# decrby key increment
$ set number1 5
$ decr number1
$ decrby number1 3
######################################
# 字符串范围 range 获取name 从0到2 共3位
$ getrange name 0 2
# 替换 从1的位置开始替换 wmj --> wmm
$ setrange name 1 ww
######################################
# setex (set with expire) 设置过期时间
# setnx (set if not exist) 如果不存在则设置 存在则设置失败 (在分布式锁中会常常使用!)
# 设置过期时间 key1 20秒后过期
$ setex key1 20 "hello"
# 如果不存在student 则设置为1001 存在则设置失败
$ setnx student 1001
# 使用redis实现分布式锁
https://www.jianshu.com/p/c970cc71070b
$ getset db redis
null
$ getset db mysql
"redis"
运行结果
-
string 类型数据操作的注意事项
-
数据操作不成功的反馈与数据正常操作之间的差异
① 表示运行结果是否成功
- (integer) 0 → false 失败
- (integer) 1 → true 成功
② 表示运行结果值
-
(integer) 3 → 3 3个
-
(integer) 1 → 1 1个
-
数据未获取到
- (nil)等同于null
-
数据最大存储量
- 512MB
-
数值计算最大范围(java中的long的最大值)
- 9223372036854775807
-
list类型
- 数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分
- 需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序
- list类型:保存多个数据,底层使用双向链表存储结构实现
# 添加/修改数据
# lpush key value1 [value2] …… 由左向右进 后入的在头部
# rpush key value1 [value2] …… 由尾部一个一个进去 后入的在最后
$ lpush mylist a b c
$ lrange mylist 0 -1
$ rpush mylist d e f
# 结果 "c" "b" "a" "hello" "world" "d" "e" "f"
# 获取数据
# lrange key start stop
# lindex key index 根据索引取值 0-列表的长度 最后一个是-1 以此类推
# llen key 得到长度
$ lindex mylist 0
$ llen mylist
# 获取并移除数据
# lpop key 获取列表第一个数据并移除 左到右
# rpop key 最后一个数据并移除
$ lpop mylist
$ rpop mylist
# 规定时间内获取并移除数据
# blpop key1 [key2] timeout
# brpop key1 [key2] timeout
# brpoplpush source destination timeout
# 移除指定数据
# lrem key count value
$ lrem mylist 1 d
$ lrem mylist -1 a
set 类型
- 新的存储需求:存储大量的数据,在查询方面提供更高的效率
- 需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询
- set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的。
#添加数据 添加一个或多个指定的member元素到集合的 key中 sadd key member1 [member2]
$ sadd myset hello world
#获取全部数据 smembers key
$ smembers myset
#删除数据 srem key member1 [member2]
$ sadd myset one two three
$ srem myset one
#获取集合数据总量 scard key
$ scard myset
#判断集合中是否包含指定数据 sismember key member
$ sismember myset two
#随机获取集合中指定数量的数据 srandmember key [count]
#随机返回一个
$ srandmember myset
#返回指定数量的值
$ srandmember myset 4
#随机获取集合中的某个数据并将该数据移出集合 spop key [count]
$ spop myset
#将一个指定的值,移动到另外一个set集合! 将myset集合中的hello值移到myset2集合中
$ smove myset myset2 hello
#set 类型数据的扩展操作
#求两个集合的交、并、差集
#sinter key1 [key2]
$ sadd set1 a b c
$ sadd set2 b c d
$ sinter set1 set2
#sunion key1 [key2]
$ sunion set1 set2
#sdiff key1 [key2]
$ sdiff set1 set2
#求两个集合的交、并、差集并存储到指定集合中
#sinterstore destination key1 [key2] 存到deinter
$ sinterstore deinter set1 set2
#sunionstore destination key1 [key2]
$ sunionstore deunion set1 set2
#sdiffstore destination key1 [key2]
$ sdiffstore dediff set1 set2
$ smembers deinter
$ smembers deunion
$ smembers dediff
#将指定数据从原始集合中移动到目标集合中 smove source destination member
$ sadd set3 0ne two
$ sadd set4 three
$ smove set3 set4 two
hash 类型
- 新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
- 需要的存储结构:一个存储空间保存多个键值对数据
- hash类型:底层使用哈希表结构实现数据存储
# 添加/修改数据 hset key field value
$ hset people name wmj
$ hset people age 24
# 获取数据 hget key field
# hgetall key
$ hget people name
$ hgetall people
# 删除数据 hdel key field1 [field2]
$ hdel people sex
# 添加/修改多个数据 hmset key field1 value1 field2 value2 …
$ hmset student id 1001 name zhangsan age 18
# 获取多个数据 hmget key field1 field2 …
$ hmget student id name age
# 获取哈希表中字段的数量 hlen key
$ hlen student
# 获取哈希表中是否存在指定的字段 hexists key field
$ hexists student age
# 获取哈希表中所有的字段名或字段值 hkeys key hvals key
$ hkeys student
$ hvals student
# 设置指定字段的数值数据增加指定范围的值
# hincrby key field increment hincrbyfloat key field increment
$ hincrby people age 2
sorted_set 类型
- 新的存储需求:数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式
- 需要的存储结构:新的存储模型,可以保存可排序的数据
- sorted_set类型:在set的存储结构基础上添加可排序字段
#添加数据 zadd key score1 member1 [score2 member2]
$ zadd zset 1 one
$ zadd zset 1 uno
$ zadd zset 2 two
$ zadd zset 3 three
#获取全部数据 zrange key start stop [WITHSCORES]
$ zrange zset 0 -1 withscores
#zrevrange key start stop [WITHSCORES] 按递减的方式进行排列
$ zrevrange zset 0 -1 withscores
#删除数据 zrem key member [member ...]
$ zrem zset uno
#按条件获取数据
#zrangebyscore key min max [WITHSCORES] [LIMIT]
$ zrangebyscore zset 1 2
#zrevrangebyscore key max min [WITHSCORES]
$ zrevrangebyscore zset 2 1
#条件删除数据
#zremrangebyrank key start stop 按照索引
$ zadd zset 4 four 5 five 6 six 7 seven
$ zrange zset 0 -1 withscores
#删除第6位和第7位 索引从0开始 要删除第6位和7位 写5-6
$ zremrangebyrank zset 5 6
#zremrangebyscore key min max score值介于min和max之间
$ zremrangebyscore zset 4 5
#获取集合数据总量
#zcard key 返回key的有序集元素个数。
$ zcard zset
#zcount key min max 返回有序集key中,score值在min和max之间(默认包括score值等于min或max)
$ zcount zset 1 3
#集合交、并操作
#zinterstore destination numkeys key [key ...] numkeys:key的个数
#zunionstore destination numkeys key [key ...]
#获取数据对应的索引(排名)
#zrank key member 拿到数据为one的排名
$ zrank zset one
#zrevrank key member 返回有序集key中成员member的排名,其中有序集成员按score值从大到小排列。排名以0为底,也就是说,score值最大的成员排名为0。
$ zrevrank zset one
#score值获取与修改
#zscore key member 返回有序集key中,成员member的score值
$ zscore zset one
#zincrby key increment member 为有序集key的成员member的score值加上增量increment。
$ zincrby zset 2 one