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. 图论之tarjan真乃神人也,强连通分量,割点,桥,双连通他都会

    先来%一下Robert Tarjan前辈 %%%%%%%%%%%%%%%%%% 然后是热情感谢下列并不止这些大佬的博客: 图连通性(一):Tarjan算法求解有向图强连通分量 图连通性(二):Tarj ...

  2. HGOI 20191101am 题解

    Problem A awesome 给出一个序列$A_i$,任取序列中三个数组成三元组$(a_i , a_j , a_k)$. 输出本质不同的且$abc \equiv 1 (mod  P)$且满足$a ...

  3. Java线程优先级及守护线程(二)

    简述 在操作系统中,线程是可以划分优先级的,优先级较高的线程,得到CPU优先执行的几率就较高一些.设置线程的优先级,有助于帮助线程规划期选择下一个哪一个线程优先执行,但是线程优先级高不代表一定会优先执 ...

  4. HDU 4496 D-City —— (并查集的应用)

    给出n个点和m条边,一条一条地删除边,问每次删除以后有多少个联通块. 分析:其实就是并查集的应用,只是前一阵子一直做图论思路一直囿于tarjan了..方法就是,记录每一条边,然后从最后一条边开始不断的 ...

  5. leetcode题目142.环形链表Ⅱ(中等)

    题目描述: 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 p ...

  6. js获取整个屏幕的尺寸

    原文 首先获取屏幕宽度:window.screen.width;    //整个屏幕的宽度. 然后获取屏幕高度:window.screen.height;     //整个屏幕的高度. 获取可用工作区 ...

  7. Install chocolatey

    Requirements Windows 7+ / Windows Server 2003+ PowerShell v2+ .NET Framework 4+ (the installation wi ...

  8. 移动端——JS(一)

    javascript(简称js)语言在移动前端可以说必不可少,许多效果都是和js相关的,包括现在移动端的一些框架:jqmobi.jqtouch.sencha touch.jquerymobile等等. ...

  9. 指定pip清华源

    临时指定: pip install cefpython3 -i https://pypi.tuna.tsinghua.edu.cn/simple 一直使用:pip的配置文件为%HOME%/pip/pi ...

  10. Mysql忘记密码,支持中文,tab补全

    忘记Mysql密码: (1)暂停服务: /etc/init.d/mysqld stop (2)跳过grant表授权,进入安全模式,并在后台运行: mysqld_safe --skip-grant-ta ...