redis核心数据结构

之前项目中使用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结构示意图

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结果示意图

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]集合中


   转载规则


《redis核心数据结构》 echi1995 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
volatile如何实现有序性 volatile如何实现有序性
之前在java内存模型中提到过volatile,这次更深入一些探究一些volatile到底是怎么实现有序性. 我们分成五个部分来看 java源码 ByteCode字节码 JVM虚拟机规范 JVM虚拟机实现 CPU级别 字节码源码中使用
下一篇 
HashMap HashMap
HashMap先贴一张从网上偷来的图 HashMap核心数据结构Hash表 = 数组 + 线性链表 + 红黑树 为什么初始容量是2的指数幂?如果创建HashMap时指定的大小不是2的指数就会报错吗? Map map = new HashMa
  目录