这里补充一下mget ,取多个key时,如果其中一个key不存在,但是也会按顺序返回nil
单个key操作和多个key操作的对比:当我们从客户端发送一条指令到服务端,有以下几个操作
客户端发送 --> 服务端处理 --> 服务端响应给客户端
多key操作:指令在发送和响应都是一次,但是到服务端处理还是会拆分开来,数据量大会造成阻塞 单key操作:需要发送很多条指令,发送和响应耗时长
首先想到一个业务:分库分表的时候,需要主键自增; 解决方案:
设置数值数据增加指定范围的值 incr key incrby key increment incrbyfloat key increment 设置数值数据减少指定范围的值 decr key decrby key increment这里需要注意的是除了incrbyfloat能加小数之外,其他的会报错
自增string需要注意的地方:
string在redis内部存储默认就是一个字符串,当遇到增减类操作incr,decr时会转成数值型进行计算。redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发 带来的数据影响。注意:按数值进行操作的数据,如果原始数据不能转成数值,或超越了redis 数值上限范围,将报错。 9223372036854775807(java中long型数据最大值,Long.MAX_VALUE) string 作为数值操作Tips 1:
redis用于控制数据库表主键id,为数据库表主键提供生成策略,保障数据库表的主键唯一性此方案适用于所有数据库,且支持数据库集群为string做过期时间
设置数据具有指定的生命周期 setex key seconds value psetex key milliseconds value比如需要统计的数值,且经常被查看的数据:如csdn账号的粉丝数、博客数等:
eg: user:id:1001:fans → 12210947 eg: user:id:1001:blogs → 6164 eg: user:id:1001:focuss → 83 在redis中以json格式存储用户信息,定时刷新(也可以使用hash类型) eg: user:id:1001 {"id":1001,"name":"java","fans":12210862,"blogs":6164, "focus":83}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 获取哈希表中所有的字段名或字段值 hkeys key hvals key 设置指定字段的数值数据增加指定范围的值 hincrby key field increment hincrbyfloat key field increment注意: 这里需要注意的是当使用 lpush 和 lpop的时候,他只是是类似于栈的先进后出,这里的**-1**指的是倒数第一个
分页查数据 这个就是通过 lrange来进行分页的
移除指定数据
lrem key count valuetips: 可以从上面看出,当插入多个数据的时候,他是无序的
求两个集合的交、并、差集 sinter key1 [key2] sunion key1 [key2] sdiff key1 [key2]tips: 这里可以看出有一点需要注意的是 sdiff 在两种情况下是不同的结果
求两个集合的交、并、差集并存储到指定集合中 sinterstore destination key1 [key2] sunionstore destination key1 [key2] sdiffstore destination key1 [key2] 将指定数据从原始集合中移动到目标集合中 smove source destination member