数据类型string
- String是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
- String类型是二进制安全的(序列化和反序列化后的结果是一致的)。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
- String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M
get <key>: 查询对应键值
set <key>: 添加键值对
append <key> <value>: 把值追加到原值的末尾 ,不是相加 若key不存在会直接创建并赋值
strlen <key>: 获取值的长度 (单位字节)
setnx <key> <value>: 即key不存在会直接创建并赋值,存在就不进行操作
incr <key> : 原子性的加1 不会被打断,将 key 中储存的数字值增1,只能对数字值操作,如果为空,新增值为1
decr <key> : 将 key 中储存的数字值减1只能对数字值操作,如果为空,新增值为-1
incrby /decrby <key> <步长> : 将key 中存储的数字值增减,自定义步长 如: incrby k1 100 表示一次性增减100
mset <key1><value1> <key2><value2>..... : MSET命令是一个原子(atomic
)操作, 所有给定键key
都会在同一时间内被设置, 不会出现某些键key
被设置了,而有一些键key
没有被设置的情况
mget <key1><key2>.... : MGET命令将返回一个列表, 列表中包含了所有给定键的值。如果给定的键里面, 有某个键不存在, 那么这个键对应的值将以特殊值 (nil)
表示
msetnx <key1><value1> <key2><value2>...: 同时设置一个或多个key-value对,当且仅当所有给定key都不存在才能成功(具有原子性)
getrange <key><起始位置><结束位置>: 获取值的范围,类似java中的substring (前后都包括)
setrange <key> <起始位置><value> : 从起始位置开始覆盖原来的值
setex <key><过期时间><value> : 设值的同时设置超时时间
getset <key><value> : 获取旧值的同时用新值代替旧值
数据类型List
- 有序可以重复
- 单键多值
- Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边),它的底层实际是个双向链表,支持双向操作(java中是双向链表只支持单向操作),对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
- list类型的lpop和rpush(或者反过来,lpush和rpop)能实现队列的功能,故而可以用Redis的list类型实现简单的点对点的消息队列。不过我不推荐在实战中这么使用,因为现在已经有Kafka、NSQ、RabbitMQ等成熟的消息队列了,它们的功能已经很完善了,除非是为了更深入地理解消息队列,不然我觉得没必要去重复造轮子
- Redis Rpop 命令用于移除列表的最后一个元素,返回值为移除的元素。brpop是rpop的阻塞版本。Redis Brpop 命令移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
lpush/rpush <key><value1><value2><value3> : 从左边/右边插入一个或多个值
lpop/rpop <key> : 从左边/右边吐出一个值 注意:先吐出的是最后进入的那个值。如果值都吐完了,键也就消亡了
lpoplpush <key1><key2> : 从<key1>列表右边吐出一个值,插到<key2>列表左边
lrange <key> <index> : 按照索引下标获得元素(从左到右) ,如: lrange k2 0 1 表示获取下标0-1 的元素, lrange k2 0 -1 表示获取k2集合中的全集
lindex <key> <index> : 按照索引下标获得元素(从左到右)
linsert <key> before/after <value><newvalue> : 在旧值(任何元素)的左边/右边插入新值
lrem <key><n><vlaue> : 从左边删除n个value (从左到右) 如:lrem l2 2 A 表示从左边起删除2个A元素
实例:
// 错误信息入redis队列
try {
redisSentinelProxy.Lpush(RedisKeyType.ERROR_MSG.getCode(), value);
} catch (Exception e) {
logger.error("错误信息入redis队列异常:{}", e);
}
// 定时任务监听队列处理错误信息
Vaule orderAcess = redisSentinelProxy.bRpop(RedisKeyType.ORDER_ERROR_MSG.getCode(),0, Value.class);
数据类型set
- set中的元素是无序的,不允许重复的
- Redis的Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)
sadd <key><value1><value2>: 将一个或多个member元素加入到集合key中,已存在于集合的member元素将被忽略
smembers <key>: 取出该集合的所有值
sismember <key><value>: 判断集合<key>是否为含有该<value>值,有返回1,没有返回0
scard <key> : 返回该集合的元素个数
srem <key><vlaue1><value2> : 删除集合中的一个或多个元素
spop <key> : 随机从集合中吐出一个值 ,吐出后集合中就没了 如: spop k1 2 表示随机吐2个
srandmember <key><n> : 随机从该集合中取出n个值,不会从集合中删除
smove <key1><key2><value> : 将key1集合里的<value> 值移到key2集合里 (是移动不是复制)
sinter <key1><key2> : 返回两个集合的交集元素
sunion <key1><key2> : 返回两个集合的并集元素
sdiff <key1><key2> : 返回两个集合的差集元素
数据类型 hash
- Redis hash 是一个键值对集合。 value 值本身也是一个k-v
- Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
- 类似Java里面的Map<String,Object>
hset <key><field><value> : 给<key>集合中的<field>键赋值<value>,第二次添加会覆盖原来的值
hget <key1> <field> : 从<key1>集合<field> 取出 value
hmset <key1> <field1> <value1> <field2> <value2>... : 批量设置hash的值
hexists key <field> : 查看哈希表 key 中,给定域 field 是否存在
hkeys <key> : 列出该hash集合的所有field
hvals <key> : 列出该hash集合的所有value
hincrby <key><field><increment> : 为哈希表key中的域field的值上增量increment
hsetnx <key><field><value> : 将哈希表key中的域field的值设置为value,当且仅当域field不存在
数据类型 zset
- 排好序的集合不能重复,score可以重复
- zset 在set 集和基础上增加了一个分值(权重),用于排序、统计、区间查找
- Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是每个成员都关联了一个评分(score) ,这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了
- 因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表
zadd <key><score1><value1><score2><value2>... : 将一个或多个 member 元素及其 score 值加入到有序集 key 当中
zrange <key><start> <stop> : 返回有序集合key中,下标在start 和stop之间的元素(正序)
zrevrange 表示逆序输出
取热度前10名:用score排序,用zrevrange取前10名
zrange key 0 -1 返回集合中全部的内容
zrangebyscore key min max : 返回所有score 值介于 min 和 max之间的成员(包含min和max 正序输出)
zrevrangebyscore 表示逆序输出
工作中用的是这个而不是 zrange
zincrby <key><increment><value> : 为元素的score加上增量
zrem <key><value> : 删除该集合中,指定值的元素
redis中没有update操作,用zrem + zadd代替更新单个数据
zcount <key><min><max> : 统计该集合,score区间内的元素个数
zcard <key> : 获取集合中元素的个数
zrank <key><value> : 返回该值在集合中的排名,从0开始。