Redis通用命令通用命令
key过期时间相关命令,以下三个状态只有在对key使用过expire命令后才有效:1代表key未过期,-2代表key过期且已经被删除,-1代表key存在,但没有设置过期时间
Redis配置文件常用配置项配置文件常用项
Redis自带客户端的基本命令操作
./redis-cli -h 连接地址 -p 连接端口 -a 密码
如果连接的就是本机且端口就是默认的6379,则前两个连接参数可省略不写
select 数据库编号
切换数据库
info [cluster|memery|server|cpu|replication...]
查看redis系统参数
flushall
清除所有数据库中存储的数据
flushdb
清除当前数据库中存储的数据
Redis的java客户端Jedis以java的jedis为例连接redis
Jedis在是线上是直接连接redis server的,如果在多线程环境下是非线程安全的,这个时候只有使用连接池,为每个Jedis实例增加物理连接(官方推荐)Lettuce连接池
基于netty,连接实例可以在多个线程间并发访问,因为是线程安全的,所以一个连接实例就可以满足多线程环境下的并发访问,当然这个也是可伸缩的设计,一个连接实例不够时也可以按需增加连接实例
在spring-boot data redis 1.x之前默认使用的是Jedis,但目前最新版已经改成了Lettuce
之前公司使用Jedis居多,lettuce近两年在逐步上升,总的来讲Jedis性能会优于Lettuce(因为它直接操作redis)testOnBorrow和testOnReturn建议在生产环境下设未false
连接池配置参数示例
从配置好的连接池里获取jedis连接对象
Spring-Boot集成Redis
1.配置Redisapplication.yml中的配置
2.添加Redis序列化方法(参考)
springboot2+redis +Jackson实现缓存序列化:
https://www.jianshu.com/p/e26a740c65b8
https://gitee.com/renrenio/renren-fast/blob/master/src/main/java/io/renren/config/Redisconfig.java
Redis的五种基本数据类型
1.string 字符串
2.hash 散列
3.list 列表
4.set 集合
5.sorted set 有序集合
字符串-strings
redis的最基本数据类型。不仅可以存储字符串,还可以存储整数或者浮点数,所存储的value容量上限为512M。
适用场景:分布式锁,计数器
字符串API
设置字符串
set key value 不管key是否存在都能设置值
同时设置多个字符串
mset key1 value1 key2 value2 ...keyN valueN
同时获取多个字符串
mget key1 key2 value2 ...keyN
key存在则设置失败,不存在则设置成功
setnx key value 相当于添加操作
实例:setnx
key存在则设置成功,不存在则设置失败
set key value xx 相当于update操作
实例:更新成功返回ok,失败返回nil
设置新的值后把旧的值返回
getset key newValue
实例:getset
将value追加到旧的value后
append key value
实例:因为演示时系统采用的是utf-8编码,所以1个中文占3个字节,所以append后返回的长度为17
获取字符串长度
strlen key (注意中文)
实例:strlen
获取字符串
get key
删除字符串
del key
自增1,如果key不存在,则自增后get(key)=1
incr key
实例:
自减1,如果key不存在,则自增后get(key)=-1
decr key
实例:decr
自增k,如果key不存在,则自增后get(key)=k
incrby key k
实例:返回自增后的值
自减k,如果key不存在,则自增后get(key)=-k
decrby key k
实例:返回自减后的值
自增一个浮点数key,如果key不存在,则自增后get(key)=key
incrbyfloat key value 注意,并没有decrbyfloat命令
实例:incrbyfloat
在指定下标位置设置一个新值
setrange key index value
实例:如果设置的是中文字符索引,则索引位必须是中文字符的第一个字节的索引位,否则设置后就会产生乱码
获取指定下标对应的值
getrange key start end
实例:可以看到,如果有中文,需要知道一个中文占几个字符再获取,否则会产生乱码
哈希-hash
hash是一个 string 类型的 field(字段)和 value(值)的映射表,特别适合用于存储对象。
每个 hash 可以存储 232 - 1 键值对(40多亿)。
适用场景:缓存视频或者用户信息,网页访问计数
哈希API
设置hash中的键值对
hset key field value
实例:成功返回1,失败返回0
设置多组hash中的键值对
hmset key field1 value1 field2 value2...fieldN valueN
实例:hmset
获取hash中的属性对应的值
hmget key field1 field2...fieldN
实例:hmget
获取hash中的属性对应的值
hget key field
实例:hget
获取hash中的所有键值对
hgetall key (谨慎使用)
实例:hgetall
删除hash中的属性对应的值
hdel key field
实例:成功返回1,失败返回0
判断hash是否拥有该属性
hexists key field
实例:属性存在返回1,不存在返回0
获取hash拥有的属性个数
hlen key
为hash里对应的属性增加固定的整数值
hincrby key field intCount
实例:返回基数后的属性值
为hash里对应的属性增加固定的整数值
hincrbyfloat key field floatCount
实例:键不存在则新建一个键进行累加,返回累加后的值
获取hash中所有的键
hkeys key
获取hash中所有的值
hvals key
设置hash中对应属性的值(如果field已经存在则设置失败)
hsetnx key field value
实例:成功返回1,不成功返回0
列表-list
列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
适用场景:TimeLine
列表API-增加操作
向列表左边或者右边添加一个或多个元素
lpush key value1 value2 ...valueN
rpush key value1 value2 ...valueN
实例:lpush
rpush
在列表的指定元素得前或后插入新元素
linsert key before value newValue
linsert key after value newValue
实例:linsert before
linsert after
列表API-删除操作
删除列表左边的元素
lpop key
实例:剔除列表最左端的元素并返回
删除列表右边的元素
rpop key
实例:删除列表最右端的元素并返回剔除列表最右端的元素并返回
blpop key timeout 阻塞一段时间,在此期间内有元素加入则立刻弹出,timeout为0则表示永远不阻塞
实例:有元素则弹出并返回,没有则返回nil
brpop key timeout 阻塞一段时间,在此期间内有元素加入则立刻弹出,timeout为0则表示永远不阻塞
实例:有元素则弹出并返回,没有则返回nil
根据count的值,从列表中删除所有和给定value相等的元素
lrem key count value
1) count > 0,从左到右删除最多count个和value相等的元素
2) count < 0 从右到左删除最多Math.abs(count)个和value相等的元素
3) count = 0 删除所有和value相等的元素
实例:返回删除的元素个数
保留指定范围内的列表元素
ltrim key start end
实例:ltrim
列表API-查询操作
获取指定范围内的所有元素
lrange key start end (包含end)
实例:
lrange
获取指定索引的元素
lindex key index
实例:获取成功则返回要获取的元素,获取不到返回nil
获取列表中元素总个数
llen key
实例:llen
修改指定索引的value
lset key index newValue
实例:如果修改索引超过了列表范围则会抛出异常
技巧lpush+lpop = stack 实现栈
lpush+rpop = queue 实现队列
lpush+ltrim = capped collection 实现固定容量的列表
lpush+brpop 消息队列集合-set
集合-set
集合是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
适用场景:各类抽奖系统,社交点赞点踩系统,为用户添加兴趣标签。
集合API-基本操作
添加一个集合
sadd key element [...element]
实例:
添加成功返回添加的元素个数,失败则返回0
删除集合中指定的元素
srem key element [...element]返回值为执行本次命令所删除的元素个数,支持删除多个元素
获取集合中元素总个数
scard key
实例:key存在则返回集合中的元素个数,key不存在则返回0
判断某一个key是否存在于给定集合中
sismember key element
实例:
存在则返回1,不存在则返回0
从集合中随机挑选出指定个数的元素
srandmember key count
不指定返回个数则默认返回1个
从集合中随机剔除一个元素
spop key
实例:spop
获取集合中所有元素,返回的结果无序,集合内数据多时谨慎使用此命令
smembers key
实例:smemberssmembers
迭代集合中键的元素
sscan key cursor [match pattern] [count count]
cursor - 游标。
pattern - 匹配的模式。
count - 指定从数据集里返回多少元素,默认值为 10
实例:每次执行便理都会返回一个游标值,在下次执行命令时使用返回的游标值,如果游标值不为0则需要继续使用返回的游标值再次执行sscan命令,直至返回的游标值为0才算遍历完毕
集合API-范围操作
获取集合间的差集
sdiff key1 key2 获取的使key1代表的集合里不存在于key2代表的集合里的元素
实例:
以传入的第一个key作为标准获取差集
获取集合间的交集
sinter key1 key2 获取的使key1代表的集合里不存在于key2代表的集合里的元素
实例:
以传入的第一个key作为标准获取交集
获取集合间的交集
sunion key1 key2 key3
实例:
sunion
将给定集合之间的差集,并集或者交集存储在指定的集合中。如果指定的集合 key 已存在,则会被覆盖
sdiffstore newkey key1 key2
实例:返回保存到新store的元素个数
sinterstore newkey key1 key2
实例:返回保存到新store的元素个数
sunionstore newkey key1 key2
实例:返回保存到新store的元素个数
有序集合-zset
有序集合的结构依然也是以key-value的形式存储,但是它的value却是由两部分组成,一部分为score,一部分为value。score也就是一个分值的概念,从而以此分值来组成一个有序集合。
适用场景:各类排行榜,通过将时间戳,销售数量,关注数作为key的score来进行排序。
有序集合API-基本操作
添加一个有序集合
zadd key score element(可以是多对) score可以重复,但element不可以重复,拿具体例子来说,一个班级里的学生学号不可以重复,但考试成绩却可以重复。
实例:
成功返回新增的元素个数,失败返回0
删除元素
zrem key element(可以是多个)
实例:
zrem(删除成功返回1,删除失败返回0)
返回元素的分数
zscore key element
实例:
zscore
增加或减少元素的分数
zincrby key increscore element
增加或减少元素的分数
实例:
如果key不存在,增加分值相当于新增一个key到集合中
返回元素总个数
zcard key
返回元素总个数
实例:
zcard
获取一个键在一个有序集合里的排名(默认按从小到大的顺序排名)
zrank key element (想要使排序顺序从高到低则用zrevrank)
返回元素在集合中的排名
实例:
zrank(是以0开始排名)
有序集合API-范围操作
获取指定区间内的成员,其中成员的位置按分数值递增(从小到大)来排序,具有相同分数值的成员按字典序(lexicographical order)来排列。
下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。
你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。
zrange key start stop [withscores] (想要使排序顺序从高到低则用zrevrange)
实例:zrange,withscores参数为可选项,表示是否将元素对应的分值一并获取
返回指定分数范围内的升序元素
zrangebyscore key minscore maxscore [withscores](想要使排序顺序从高到低则用zrevrangebyscore)
实例:
zrangebyscore
返回指定分数范围内的元素个数
zcount key minscore maxscore
实例:
zcount
根据排名范围删除元素
zremrangebyrank key start end
实例:
成功返回删除的元素个数,失败返回0
根据分数范围删除元素
zremrangebyscore key minscore maxscore
实例:成功返回删除的元素个数,失败返回0
集合 VS有序集合 VS 列表
重复元素 X X O
有序 X O O
存储结构 element element+score element