Redis(1.2)Redis的数据结构与基本操作
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的数据结构与基本操作的更多相关文章
- Redis 系列(02)数据结构
目录 Redis 系列(02)数据结构 Redis 系列目录 1. String 1.1 基本操作 1.2 数据结构 1.3 Redis数据存储结构 2. Hash 2.1 基本操作 2.2 数据结构 ...
- Redis(1)——5种基本数据结构
一.Redis 简介 "Redis is an open source (BSD licensed), in-memory data structure store, used as a d ...
- Redis系统学习 二、数据结构
一.字符串 1.在Redis里,字符串是最基本的数据结构.当你在思索着关键字-值对时,你就是在死锁着字符串数据结构.不要被名字给搞混了. 常见实例: set users:leto " ...
- 深入剖析Redis系列:Redis数据结构与全局命令概述
前言 Redis 提供了 5 种数据结构.理解每种数据结构的特点,对于 Redis 的 开发运维 非常重要,同时掌握 Redis 的 单线程命令处理 机制,会使 数据结构 和 命令 的选择事半功倍. ...
- Redis源码分析-底层数据结构盘点
前段时间翻看了Redis的源代码(C语言版本,Git地址:https://github.com/antirez/redis), 过了一遍Redis数据结构,包括SDS.ADList.dict.ints ...
- Redis(一)基础数据结构
1.目录 Redis 基础数据结构 string (字符串) list (列表) hash (字典) set (集合) zset (集合) 容器型数据结构的通用规则 过期时间 2.Redis 基础数据 ...
- Redis(一)、Redis五种数据结构
Redis五种数据结构如下: 对redis来说,所有的key(键)都是字符串. 1.String 字符串类型 是redis中最基本的数据类型,一个key对应一个value. String类型是二进制安 ...
- 聊聊Mysql索引和redis跳表 ---redis的有序集合zset数据结构底层采用了跳表原理 时间复杂度O(logn)(阿里)
redis使用跳表不用B+数的原因是:redis是内存数据库,而B+树纯粹是为了mysql这种IO数据库准备的.B+树的每个节点的数量都是一个mysql分区页的大小(阿里面试) 还有个几个姊妹篇:介绍 ...
- [redis读书笔记] 第一部分 数据结构与对象 对象类型
- 从前面redis的基本数据结构来看,可以看出,redis都是在基本结构(string)的基础上,封装了一层统计的结构(SDS),这样让对基本结构的访问能够更快更准确,提高可控制度. - redis ...
- Redis(一):数据结构与对象
前言 本书是Redis设计与实现的读书笔记,旨在对Redis底层的数据结构及实现有一定了解.本书所有的代码基于Redis 3.0. 简单动态字符串 SDS Redis没有直接使用C语言中的字符串,而是 ...
随机推荐
- INLINE HOOK过简单驱动保护的理论知识和大概思路
这里的简单驱动保护就是简单的HOOK掉内核API的现象 找到被HOOK的函数的当前地址在此地址处先修改页面保护属性然后写入5个字节.5个字节就是一个简单的JMP指令.这里说一下JMP指令,如下: 00 ...
- [Luogu] 文艺平衡树(Splay)
题面:https://www.luogu.org/problemnew/show/P3391 题解:https://www.zybuluo.com/wsndy-xx/note/1138892
- Codeforces Round #580 (Div. 2)
这次比上次多A了一道,但做得太慢,rating还是降了. Problem A Choose Two Numbers 题意:给出两个集合A,B,从A,B中分别选出元素a,b使得a+b既不属于集合A,又不 ...
- x86—EFLAGS寄存器详解[转]
鉴于EFLAGS寄存器的重要性,所以将这一部分内容从处理器体系结构及寻址模式一文中单独抽出另成一文,这部分内容主要来自Intel Developer Mannual,在后续的内核系列中遇到的许多和EF ...
- HDU–5988-Coding Contest(最小费用最大流变形)
Coding Contest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- 2016"百度之星" - 初赛(Astar Round2A)1006 Gym Class(HDU5695)——贪心+拓扑排序
分析:首先,利用贪心可知,如果要所有人的分数和最高,需要把序号大的优先放在前面.其次,对于a的前面不能为b,那么只能a在b前面了,那么就建立一条从a到b的边,并且b的入度加1.然后就是拓扑排序了.要分 ...
- redis服务及其配置与应用(window 环境下)
一.redis简介:Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API(源自百度百科),个人更喜欢下面的解释:我们 ...
- moveLeft()
这里大致都和上面一样,就是在记录左边坐标时,应该应该是lx = x - 1. void moveLeft(){ //定义变量存放人物左边的坐标 int lx, ly; //当左边没有元素时,直接ret ...
- Leetcode题目79.单词搜索(回溯+DFS-中等)
题目描述: 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许 ...
- Leetcode题目48.旋转图像(中等)
题目描述: 给定一个 n × n 的二维矩阵表示一个图像. 将图像顺时针旋转 90 度. 说明: 你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵.请不要使用另一个矩阵来旋转图像. 示例 1 ...