之前项目中使用redis就是很简单的将值以键值对的形式放进去,顶多设个过期时间.
现在去看了一下redis实际上也提供了很多有用的功能,学习一下以备以后用得上.
redis数据结构
string
string就是平常用的键值对,没有太多好说的,很简单.
string的常用操作
SET key value
MSET key value [key value…]
SETNX key value // 存入一个不存在的键值对 (可以用作cas)
GET key
MGET key [key…]
DEL key [key…]
EXPIRE key seconds // 设置key的过期时间
一些原子操作
INC key // 将key中对应的值加1
DECR key // 将key中对应的值减1
INCRBY key increment // 将key中对应的值加[increment]
DECRBY key decrement // 将key中对应的值减[increment]
string指令可以用来做什么
在这里,SETNX
命令是只有当key不存在的时候才生效, SETNX actually means "SET if Not eXists".
可以用于:
当多线程竞争,先写入且写成功的那个线程成功加锁, 在执行完毕后将该key删除, 后续的线程可以继续争夺该锁.
public void doSomethingWithCAS(String key) {
try (Jedis client = getClient()) {
client.select(dbId);
while (true){
Long setnx = client.setnx(key, "");
if (setnx > 0){
// 获取锁成功
// doSomething
// 释放锁
client.del(key);
}else {
// 如果获取锁没成功, 将线程阻塞或者休眠
// 这里简单处理
Thread.sleep(20);
//如果是选择将线程阻塞,需要在释放锁的地方将阻塞的线程重新唤醒
//LockSupport.park();
}
break;
}
} catch (Exception e) {
logger.error(e);
}
}
hash
hash就不再是一个key对应一个value, 他更像是一个key对应一个Map.
hash常用操作
HSET key field value
HSETNX key field value // 不存在时才会存储成功
HMSET key field value [key value…]
HGET key field
HMGET key field [field..]
HDEL key field [field…]
HLEN key // 返回key中所有field的总数
HGETALL key // 返回key中所有的键值
原子操作
HINCRBY key field increment // 为field的值增加[increment]
list
list代表一个key对应一系列的value
list常用操作
LPUSH key value [value…] // 从list列表的表头插入(左边)
RPUSH key value [value…] // 从list列表的表尾插入(右边)
LPOP key // 移除并返回list的表头
RPOP key // 移除并返回list的表尾
LRANGE key start stop // 返回list指定区间的元素, 以[start]和[stop]定位区间
BLPOP key [key…] timeout // 从表头获取一个元素,如果列表中没有元素则阻塞. 如果timeout=0,则一直阻塞
BRPOP key [key…] timeout // 从表尾获取一个元素, 如果列表中没有元素则阻塞.
set
set常用操作
SADD key member [member…]
SREM key member [member…] // 从set中删除远古三
SMEMBERS key // 获取set中的元素
SCARD key // 获取set的元素个数
SISMEMBER key member // 判断[member]是否存在set集合中
SRANDMEMBER key [count] // 从set中随机选出[count]个元素, 元素不从set中删除
SPOP key [count] // 从set中随机选出[count]个元素, 元素从set中删除
set运算操作
SINTER key [key…] // 取交集
SINTERSTORE destination key [key…] // 将交集结果存入新的[destination]集合中
SUNION key [key…] // 取并集
SUNIONSTORE destination key [key…] // 将并集结果存入新的[destination]集合中
SDIFF key [key…] // 取差集
SDIFFSTORE destination key [key…] // 将差集结果存入新的[destination]集合中