Redis系列(二)

一、基本数据类型
   Redis支持六种数据类型:string(字符串)、hash(哈希),list(列表),set(集合),zset(sorted set:有序集合),stream(5.0版本+)
   不常见的类型:bitmap ,HyperLogLog(2.8.9版本+),Geo(3.2版本+)。

二、常见类型命令操作
   1、string类型可以使用get、set、del、incr、decr等操作
     数据结构是采用(Simple Dynamic String)SDS,而非C的字符串类型。
     结构:  typedef char *sds;
        struct sdshdr {
            // buf 已占用长度
            int len;
            // buf 剩余可用长度
            int free;
            // 实际保存字符串数据的地方
            char buf[];
        };    
     其存储数据结构决定计算长度的算法复杂度为O(1) ,另外在因为存在free的空间可以使得在字符串追加是减少内存重新分配的次数,二进制安全(不会产生内存溢出)。
     分配策略,及触发时间,首次创建时free=0,当字符串变更时重新分配内存。
     # 如果新字符串的总长度小于 SDS_MAX_PREALLOC (命令查看:)
     # 那么为字符串分配 2 倍于所需长度的空间
     # 否则就分配所需长度加上 SDS_MAX_PREALLOC 数量的空间
    Java 操作方式:redisTemplate.opsForValue()**  @see org.springframework.data.redis.core.ValueOperations
  2、hash类型可以使用hmget、hmset、hgetall、hkeys等操作
     其数据结构:字典结构,字典结构底层是通过简单,高效的哈希表实现。
     结构:/*
              * 字典
              * 每个字典使用两个哈希表,用于实现渐进式 rehash
              */
      typedef struct dict {
          // 特定于类型的处理函数
          dictType *type;
          // 类型处理函数的私有数据
          void *privdata;
          // 哈希表(2 个 ht[0]  ht[1])
          dictht ht[2];
          // 记录 rehash 进度的标志,值为 -1 表示 rehash 未进行
          int rehashidx;
          // 当前正在运作的安全迭代器数量
          int iterators;
      } dict;
    /*
     * 哈希表
     */
    typedef struct dictht {
        // 哈希表节点指针数组(俗称桶,bucket)
        dictEntry **table;
        // 指针数组的大小
       unsigned long size;
       // 指针数组的长度掩码,用于计算索引值
       unsigned long sizemask;
       // 哈希表现有的节点数量
      unsigned long used;
   } dictht;
        /*
         * 哈希表节点
         */
       typedef struct dictEntry {
         // 键
         void *key;
         // 值
          union {
            void *val;
            uint64_t u64;
            int64_t s64;
         } v;
         // 链往后继节点
        struct dictEntry *next;
      } dictEntry;
         Redis 目前使用两种不同的哈希算法:
            A:MurmurHash2 32 bit 算法:这种算法的分布率和速度都非常好, 具体信息请参考 MurmurHash 的主页: [http://code.google.com/p/smhasher/] 。
            B: 基于 djb 算法实现的一个大小写无关散列算法:具体信息请参考 [http://www.cse.yorku.ca/~oz/hash.html] 。
          使用哪种算法取决于具体应用所处理的数据:
               命令表以及 Lua 脚本缓存都用到了算法 B。
               算法A 的应用则更加广泛:数据库、集群、哈希键、阻塞操作等功能都用到了这个算法。
          Java操作:redisTemplate.opsForHash()
    3、list类型可以使用rpush、lpush、rpop、lpop等
       底层结构:压缩链表或者双端链表
       Java操作: redisTemplate.opsForList()
    4、集合类型可以使用sadd、srem、scard、spop、smove登录
       底层数据结构:字典
       Java操作: redisTemplate.opsForSet()
    5、有序集合可以使用zadd、zrem等
       底层数据结构:跳跃表
       Java操作: redisTemplate.opsForZSet()        
 三、java中redis常见连接工具
  redisson,
  jedis是redis官方推荐的
  springboot的redisTemplate
  等等
 四、参考链接
    [https://redisbook.readthedocs.io/]
    [http://redisinaction.com/]

你可能感兴趣的:(Redis系列(二))