Redis的数据结构,其本身大方向是键值对

【0】大概特点

相关产品:Redis、Riak、SimpleDB、Chordless、Scalaris、Memcached

形式:Key 指向 Value 的键值对,通常用hash table来实现

 应用:内容缓存

优点:扩展性好、灵活性好、大量写操作时性能高

缺点:无法存储结构化信息、条件查询效率较低

使用者:百度云(Redis)、GitHub(Riak)、BestBuy(Riak)、Twitter(Ridis和Memcached)

【1】五种数据类型

  (1)String:字符串             (2)List:字符串列表

  (3)sorted set:有序字符串集合     (4)set :字符串集合

  (5)Hash:哈希

【2】Key定义的注意点

  (1)不要过长

  (2)不要过短

  (3)统一的命名规范

【3】基本用法

目录: 

【3.1】String
【3.2】Hash
【3.3】List
【3.4】set
【3.5】Sorted-Set
【3.6】Keys的通用操作

正文:

【3.1】String

   【3.1.1】String的存储

      (1)二进制安全存储,存入和获取的数据相同

      (2)单个Value最多可以容纳512M以上数据

   【3.1.2】常用命令

      (1)set 赋值:set key value       =》set name zhangsan

      (2)get 取值:get key           =》get name

      (3)getset 取值并重新复制:getset key value   =》get name lisi

      (4)del 删除:delete key           =》del name  =》del name1 name2 name3(批量删除)

      (5)incr/decr 数值递增递减:《1,递增》incr key =》incr num    《2,递减》decr key =》decr key

                如果num不存在,则默认值为0,如果操作在字符串上则报错

      (6)incrby/decrby 加减运算:《1,加》incrby key addnum =》incrby num 5         -- 给num key对应的 value 数字 +5

              《2,减》decrby key subnum =》decrby num 3        -- 给num key对应的 value 数字 -3

      (7)append 拼接字符串:append key =》append name abc   -- 如果 name 是 lisi ,则结果应该是 lisiabc      -- 如果key不存在,则新建该key,且value为 abc

      (8)查看所有key:keys *

        

【3.2】Hash

   【3.2.1】Hash 的存储

      String Key 和 String Value 的 map 容器

      每一个 Hash 可以存储 4294967295 一个无符号4字节的 键值对

      一个hashkey 中可以包含多个 key value 键值对

      【3.2.2】常用命令

      (1)hset 赋值:hset hashkey key value =》hset myhash user jack,其实这也可以多个 hset hashkey key1 value1 key2 value2 key3 value3

      (2)hmset 批量赋值:hmset hashkey key1 value1 key2 value2 =》hmset myhash2 user jack age 20

      (3)hget 取值:hget hashkey key =》hget myhash user

      (4)hmget 批量取值:hmget hashkey key1 key2 =》hmget myhash2 user age

      (5)hgetall 获取所有key value:hgetall myhash2

      (6)hdel 删除:hdel hashkey key1 key2

      (7)del 删除hashkey:del hashkey

      (8)hincrby/hdecrby 加减运算:hincrby hashkey key addnum

      (9)hexists 存在判断:hexists hashkey key  -- 返回 1 代表存在,0代表不存在

      (10)hlen 获取key数量:hlen hashkey

      (11)hkeys 获取hashkey中的所有Key:hkeys hashkey

      (12)hvals 获取所有value:hvals hashkey

       (13)hsetnx 创建hashkey中的key,如果不存在则创建,如果存在则不创建:hsetnx hashkey key value

        

【3.3】List

【3.3.1】存储形式

  《1》ArrayList 使用数组存储方式  《2》LinkedList 使用双向链表方式

  ArrayList:根据索引,查询非常快,新增和删除节点的时候慢(特别是中间节点,因为要移动数据);

  LinkedList:增删节点非常快

【3.3.2】List 的常用命令

理论:

(1)两端添加节点(lpush/rpush):lpush listkey value3 value2 value1(这里的顺序是从右到左),rpush是从左到右。
(2)查看列表(lrange ):lrange listkey begin_pos end_pos(0表示第一个元素下标,-1表示最后一个元素下标)
(3)两端删除/取出节点(lpop/rpop)
    《1》lpop listkey :如果listkey存在,则删除list的第1个元素
    《2》rpop listkey :如果listkey存在,则删除list的最后个元素
(4)获取列表元素个数(llen listkey):
(5)判断listkey是否存在,存在则添加(lpushx/rpushx)
(6)根据value删除(lrem)
lrem listkey count value :从listkey 中删除 count个 值为value的元素
  其中,count为正数的时候正序删除,count为负数的时候,倒叙删除,count为0的时候全部删除。
(7)修改list下标所在值(lset):lset listkey 下标号 value
(8)在某个value之前插入newvalue:linsert keylist before/after value newvalue
(9)将A listkey中的最后一个下标value 转移到B listkey中的0下标(rpoplpush):rpoplpush listkeyA listkeyB 。
  用途:当消费者从队列中pop时做一个备份,以便当消费者已经取出信息但还没有来得及处理就崩溃导致该数据丢失,保证了数据的一致性。

实践:

  (1)两端添加节点(lpush/rpush):lpush listkey value3 value2 value1(这里的顺序是从右到左),rpush是从左到右。

  (2)查看列表(lrange ):lrange listkey begin_pos end_pos(0表示第一个元素下标,-1表示最后一个元素下标)  

      

  (3)两端删除/取出节点(lpop/rpop)

    《1》lpop listkey :如果listkey存在,则删除list的第1个元素

    《2》rpop listkey :如果listkey存在,则删除list的最后个元素

        

  (4)获取列表元素个数(llen listkey):

    

  (5)判断listkey是否存在,存在则添加(lpushx/rpushx)

   (6)根据value删除(lrem)

      lrem listkey count value :从listkey 中删除 count个 值为value的元素

      其中,count为正数的时候正序删除,count为负数的时候,倒叙删除,count为0的时候全部删除。

        

  (7)修改list下标所在值(lset):lset listkey 下标号  value

      

   (8)在某个value之前插入newvalue:linsert keylist before/after value newvalue

      

  (9)将A listkey中的最后一个下标value 转移到B listkey中的0下标(rpoplpush):rpoplpush listkeyA listkeyB   。用途:当消费者从队列中pop时做一个备份,以便当消费者取出信息时还没有来得及处理就崩溃导致该数据丢失,保证了数据的一致性。

      

【3.4】set

【3.4.1】set 的存储

  Set 和 List 差不多,但Set 集合中不允许出现重复的元素。

  Set 可以包含最大的元素数量是2^32 * 2

【3.4.2】set 的基本操作

  (1)sadd(添加):sadd setkey value1 value2 value3

  (2)srem(删除):srem setkey value1 value2

  (3)smembers(查看):smembers setkey

  (4)(修改)

  (5)sismember(判断 value 是否存在于 setkey,存在返回1,否则0):sismember setkey value

  (6)sdiff(差集运算):sdiff setkey1 setkey2

  (7)sinter(交集运算):sinter setkey1 setkey2

  (8)sunion(并集运算):sunion setkey1 setkey2

  (9)scard(元素数量):scard keyset

  (10)srandmember(随机获取1个value):srandmember setkey

  (11)sdiffstore(把两个setkey的差集存到一个新的setkey):sdiffkey key1 key2 stroekey

     sinterstore key1 key2 stroekey    把两个 setkey 的交集存到一个新的setkey

       sunionstore key1 key2 storekey   把两个 setkey 的并集存到一个新的setkey

【3.5】Sorted-Set

【3.5.1】Sorted-Set 存储

  Sorted-Set 与 Set 的区别:

    Sorted-Set 有一个分数与之关联,通过分数对成员进行从小到大的排序。成员是唯一的,但分数是可以重复的。

    Sorted-Set中的成员在集合中的位置是有序的,所以对中部成员检索也是比较高效的。

    应用场景:游戏排名、微博热搜榜 等等

【3.5.2】基本操作

  (1)zadd(增加):zadd sortkey score1 value1 score2 value2

             如果,已经有 70 zs 80 ls  ,再进行 zadd sortkey 100 zs,那么value相同,就改变了其 value 对应的 score

  (2)zrem(删除):zrem sortkey value1 value2...

              zremrangebyrank sortkey 0 4 -- 删除 0~4下标对应的value and score

              zrerangebyscore sortkey 80 100 -- 删除 80 ~ 100分的 value and score

  (3)zscore(查看分数):zscore sortkey zs   -- 结果是100(见(1)中的再次操作)

  (4)zcard(查看成员数量):zcard sortkey

  (5)zrange(范围查看):zrange sortkey 0 -1  -- 只显示value

                zrange sortkey 0 -1 withscores -- 升序显示value and score

                zrevrange sortkey 0 -1 withscores -- 降序显示 value and score

                zrangebyscore sortkey 0 100 -- 升序显示 分数在0~100之间的value

                zrangebyscore sortkey 0 100 with scores limit 0 2 --查询分数在0~100之间的 score(withscores) 与 对应的 value,并且从第0个开始去2个(limit 0 2)            

  (6)zincrby(增加分数):zincrby sortkey 3 zs -- 给 zs 对应的score +3

  (7)zcount(统计个数):zcount sortkey 80 90 -- 统计80~90分存在value的个数

【3.6】Keys的通用操作

  无论是什么类型的redis key,都可以使用这些命令来进行相关操作

【3.6.1】基本操作

  (1)keys(查看当前所有类型的key):keys *  --查看所有     keys  a* --查看a开头的key

  (2)del(删除任意类型的key):del andkey1 andkey2 andkey3

  (3)rename(重命名):rename anykey1 andkey2

  (4)expire (过期时间):expire andkey 1000  --单位为秒

  (5)ttl(查看有效期):ttl andkey --结果为当前有效的时间,单位为秒

  (6)type(查看 anykey 的数据类型):type anykey

Redis(1.2)Redis的数据结构与基本操作的更多相关文章

  1. Redis 系列(02)数据结构

    目录 Redis 系列(02)数据结构 Redis 系列目录 1. String 1.1 基本操作 1.2 数据结构 1.3 Redis数据存储结构 2. Hash 2.1 基本操作 2.2 数据结构 ...

  2. Redis(1)——5种基本数据结构

    一.Redis 简介 "Redis is an open source (BSD licensed), in-memory data structure store, used as a d ...

  3. Redis系统学习 二、数据结构

    一.字符串     1.在Redis里,字符串是最基本的数据结构.当你在思索着关键字-值对时,你就是在死锁着字符串数据结构.不要被名字给搞混了. 常见实例: set users:leto " ...

  4. 深入剖析Redis系列:Redis数据结构与全局命令概述

    前言 Redis 提供了 5 种数据结构.理解每种数据结构的特点,对于 Redis 的 开发运维 非常重要,同时掌握 Redis 的 单线程命令处理 机制,会使 数据结构 和 命令 的选择事半功倍. ...

  5. Redis源码分析-底层数据结构盘点

    前段时间翻看了Redis的源代码(C语言版本,Git地址:https://github.com/antirez/redis), 过了一遍Redis数据结构,包括SDS.ADList.dict.ints ...

  6. Redis(一)基础数据结构

    1.目录 Redis 基础数据结构 string (字符串) list (列表) hash (字典) set (集合) zset (集合) 容器型数据结构的通用规则 过期时间 2.Redis 基础数据 ...

  7. Redis(一)、Redis五种数据结构

    Redis五种数据结构如下: 对redis来说,所有的key(键)都是字符串. 1.String 字符串类型 是redis中最基本的数据类型,一个key对应一个value. String类型是二进制安 ...

  8. 聊聊Mysql索引和redis跳表 ---redis的有序集合zset数据结构底层采用了跳表原理 时间复杂度O(logn)(阿里)

    redis使用跳表不用B+数的原因是:redis是内存数据库,而B+树纯粹是为了mysql这种IO数据库准备的.B+树的每个节点的数量都是一个mysql分区页的大小(阿里面试) 还有个几个姊妹篇:介绍 ...

  9. [redis读书笔记] 第一部分 数据结构与对象 对象类型

    - 从前面redis的基本数据结构来看,可以看出,redis都是在基本结构(string)的基础上,封装了一层统计的结构(SDS),这样让对基本结构的访问能够更快更准确,提高可控制度. - redis ...

  10. Redis(一):数据结构与对象

    前言 本书是Redis设计与实现的读书笔记,旨在对Redis底层的数据结构及实现有一定了解.本书所有的代码基于Redis 3.0. 简单动态字符串 SDS Redis没有直接使用C语言中的字符串,而是 ...

随机推荐

  1. aarch-linux-gnu-g++ install

    # apt install g++-aarch64-linux-gnuReading package lists... 0% Reading package lists... Done Buildin ...

  2. STL中的BITSET运用

    胡小兔的OI博客C++ bitset 常用函数及运算符 对于一个叫做foo的bitset: foo.size() 返回大小(位数) foo.count() 返回1的个数 foo.any() 返回是否有 ...

  3. CentOS7部署tomcat

    首先检查是否安装了jdk,然后再查看是否配置了JAVA_HOME 配置JAVA_HOME的方法: 我的是jdk已经安装好了是1.8 我需要找到它的安装目录 [root@bogon xwg]# java ...

  4. 5.13T1Send 题(send)

    Send 题(send) [题目描述] 某个国家有

  5. tracert命令与tracert (IP地址)-d有什么区别?

    他们的意义基本相同,都是路由追踪,返回从源到目标的路由情况:但tracert -d不解析各路由器的名称,只返回路由器的IP地址.而tracert 不仅返回各路由器的IP地址,而且返回其名称.简单来说, ...

  6. 20182303 2019-2020-1 《数据结构与面向对象程序设计》第2&3周学习总结

    目录 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考试错题总结 结对及互评 点评 学习进度条 教材学习内容总结 教材第二章内容 学习Java基本数据类型以及 ...

  7. layer.js错误Uncaught TypeError: i is not a function

    最初是要写一个管理后台来着,项目中需要用到弹出层,但是没有前端配合,我一个小PHP需要去写这玩意,怎么办呢?查了一些资料,发现layer对我来说还行,文档写的也比较完全,学习成本不高,就下决心用这个了 ...

  8. LaTeX统计文章字数

    今天学会了用LaTeX命令统计文章字数,命令如下: textcount doc_full_path.tex 效果如下:

  9. CentOS7 源码安装 PostgreSQL 12

    PostgreSQL 12 源码安装 Table of Contents 1. 下载 2. 准备环境 3. 编译安装 4. 设置环境变量 5. 初始化数据库 6. 配置参数文件 6.1. postgr ...

  10. wait_timeout 和 interactive_timeout

    wait_timeout 和 interactive_timeout Table of Contents 1. 参数说明 2. 原代码 3. interactive_timeout覆盖wait_tim ...