Redis(1)

Redis5

1 Nosql

非关系型数据库,全名Not only SQL。不是为了替代关系型数据库(Oracle、SQLServer、MySQL、DB2等),为了解决高并发、高可用、高可扩展,大数据存储等一系列问题而产生的数据库解决方案,所以它并不能替代关系型数据库,只能作为关系型数据库的一个良好补充。NoSQL需要关系型数据库结合,才能发挥真正的价值和意义。

NoSQL四大类
1)键值存储数据库
主要是基于 key-value 的关系来保存,数据库中默认有一个哈希表,通过此表来完成一个特定的键指向一个特定的数据,key-value 键值对模型优势在于简单易用,
当需要大量数据处理的时候,优势非常明显,缺点在于如果仅仅只更新少量数据值的时候,效率有所下降。常见的几种键值存储型 NoSQL:Redis, Tokyo Tyrant, Voldemort, Oracle BDB。
2)列存储数据库
通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。如:Cassandra, HBase, Riak。
3)文档型数据库
它同第一种键值存储相类似。但是此类数据库更多的时候存放内容都是半结构化的内容,比如存放 JSON 格式的数据。文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。如:CouchDB, MongoDB. 国内也有文档型数据库 SequoiaDB,目前已经开源。
4)图形结构数据库
同其他行列以及刚性结构的 SQL 数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL 数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多 NoSQL 数据库都有 REST 式的数据接口或者查询 API。如:Neo4J, InfoGrid, Infinite Graph.

概念
远程的内存数据库,为解决问题而生,速度非常快,5种不同类型的数据结构。通过复制、持久化(persistence)和客户端分片(clientsidesharding)等特性,用户可以很方便地将 Redis 扩展成一个能够包含数百 GB 数据、每秒处理上百万次请求的系统。

Redis 和其他缓存服务器对比
在这里插入图片描述

Redis 优势
1.读写性能极高:读的速度每秒可达10w+(官方测试最高50w),写速度每秒可达10w左右,略低于读的速度。
2.丰富的数据类型:String、List、Hash、Set、Sorted Set(Zset)数据类型操作
3.原子性:单线程,所有操作原子性,并且拥有事务,只是事务处理能力略低于关系型数据库。

应用场景
1.系统服务缓存,比如查询数据、网页展示内容,cookie缓存,session缓存,购物车等等。
2.分布式集群架构中的session分离。
3.IM(即时聊天工具)中的好友列表、系统服务中的任务列表,团购队列,抢票队列,下载排行,播放排行,热火度排行等等。

注意:redis 是一个高并发高效能的 k-v 存储 nosql,由于数据是存在内存中,因此数据访问非常快,当项目中涉及到数据库的查询非常多,而数据变化并不频繁时,就可以在项目中采用redis 分担 MySQL 的大部分访问压力。

2 Redis 安装

https://blog.csdn.net/weixin_45044097/article/details/103682669

3 Redis数据类型

结构类型 结构存储的值 结构的读写能力
string 字符串,整数,浮点数 对整个字符串或者字符串的一部分执行操作,对整数和浮点数执行自增(increment)或者自减(decrement)操作
list 链表,每个节点包含一个字符串 从链表两端推入或者弹出元素,根据偏移量对链表进行修剪(trim),读取单/多个元素,根据值查找或者移除元素
set 包含字符串的无序收集器(undered collection),并且被包含的每个字符串都是独一无二,各不相同的 添加、获取、移除单个元素,检查一个元素是否在集合中,计算交/并/差集
hash 包含键值对的无序散列表 添加,获取,移除单个键值对,获取所有键值对
zset(有序集合) 字符串成员(member)与浮点数(score)之间的有序映射,元素的排列顺序由分值的大小决定 添加,获取,移除单个元素,根据分值范围(range)或者成员来获取元素

3.1 String

基础命令:get,set,del
进阶命令:append,getrange,setrange,getbit,setbit,bitcount,bitop
在这里插入图片描述

3.2 List列表

有点像java中的Linkedlist,相同的元素可以重复出现。
LPUSH 命令和 RPUSH 命令分别用于将元素推入列表的左端(leftend)和右端(rightend);
LPOP 命令和 RPOP 命令分别用于从列表的左端和右端弹出元素,移除并返回这个元素;
LINDEX 命令用于获取列表在给定位置上的一个元素;
LRANGE 命令用于获取列表在给定范围上的所有元素。
LTRIM 对列表进行修剪: ltrim keyName start end——保留[start,end]范围的元素
在这里插入图片描述
列表进阶命令:

命令 用例和描述
blpop blpop keyName [keyName…] timeout——从第一个非空列表中弹出位于最左端的元素,或者在timeout秒之内阻塞并等待可弹出的元素出现
brpop
rpoplpush rpoplpush sourceKey destKey——从sourceKey列表中弹出位于最右端的元素,然后将这个元素推入destKey列表的最左端,并向用户返回这个元素
brpoplpush brpoplpush sourceKey destKey timeout——从sourceKey列表中弹出位于最右端的元素,然后将这个元素推入destKey列表的最左端,并向用户返回这个元素;如果sourceKey为空,那么在timeout秒之内阻塞并等待可弹出的元素出现

使用场景:

  1. 栈,先进后出,命令组合为:lpush+lpop=Stack
  2. 队列,先进先出,使用方式为:lpush+rpop=Queue
  3. 有限集合,控制溢出元素,lpush+ltrim=Limited Collection
    在这里插入图片描述

3.3 Set集合

Redis 的集合和列表都可以存储多个字符串,他们之间的不同在于,列表可以存储多个相同的字符串,而集合则通过使用散列表来保证自己存储的每个字符串都是各不相同的(这些散列表只有键,但是没有与键相关联的值),如同java的set。
因为 Redis 的集合使用无序(unordered)方式存储元素,所以用户不能像使用列表那样,将元素推入集合的某一端,或者从集合的某一端弹出元素。不过用户可以使用 SADD 命令将元素添加到集合,或者使用 SREM 命令从集合里面移除元素。另外还可以通过 SISMEMBER命令快速地检查一个元素是否已经存在于集合中,或者使用 SMEMBERS 命令获取集合包含的所有元素(如果集合包含的元素非常多,那么 SMEMBERS 命令的执行速度可能会很慢,所以请谨慎地使用这个命令)。

基础命令:sadd(添加),srem(移除),sismember(检查),scard(数量),smembers(查看所有),spandmember,spop,smove
在这里插入图片描述
跟字符串和列表一样,集合除了基本的添加,移除操作,还有sinter,sunion,sdiff这三个命令执行交集,并集,差集计算

进阶命令:(用于处理多个集合)
在这里插入图片描述
使用场景:
redis set是集合类型的数据结构,那么集合类型就比较适合用于聚合分类。
1.标签:比如我们博客网站常常使用到的兴趣标签,把一个个有着相同爱好,关注类似内容的用户利用一个标签把他们进行归并。
2.共同好友功能,共同喜好,或者可以引申到二度好友之类的扩展应用。
3.统计网站的独立 IP。利用set集合当中元素不唯一性, 可以快速实时统计访问网站的独立IP。

3.4 Hash 散列

散列可以存储多个键值对之间的映射,和字符串一样,散列存储的值既可以是字符串又可以是数字值,并且用户同样可以对散列存储的数字值执行自增操作或者自减操作。如同java中的HashMap
在这里插入图片描述
基础命令:hset,hget,hgetall,hdel
在这里插入图片描述
可以将 Redis 的散列看作是关系数据库里面的行,因为散列、文档和行这三者都允许用户同时访问或者修改一个或多个域(field)。
进阶命令:
在这里插入图片描述
注意:
在对散列进行处理的时候,如果键值对的值的体积非常庞大,那么用户可以先使用
HKEYS 获取散列的所有键,然后通过只获取必要的值来减少需要传输的数据量。除此之外,用户还可以像使用 SISMEMBER 检查一个元素是否存在于集合里面一样,使用 HEXISTS 检查一个键是否存在于散列里面。

使用场景

  1. 购物车
  2. 存储关系型数据库中的行

尽量用hash来存储数据

3.5 有序集合

有序集合和散列一样,都用于存储键值对:有序集合的键被称为成员(member),每个成员都是独各不相同;而有序集合的值则被称为分值(score),分值必须为浮点数。有序集合是Redis 里面唯一个既可以根据成员访问元素(这一点和散列一样),又可以根据分值以及分值的排列顺序来访问元素的结构。
在这里插入图片描述
基础命令:
在这里插入图片描述
进阶命令:
在这里插入图片描述
除了使用逆序来处理有序集合之外,ZREV*命令的工作方式和相对应的非逆序命令的工作方式完全一样(逆序就是指元素按照分值从大到小地排列)。

ZINTERSTORE-交集
同时存在于 zset-1 和 zset-2 里面的元素被添加到 zset-i 里面
在这里插入图片描述
ZUNIONSTORE-并集
并集运算和交集运算不同,只要某个成员存在于至少一个输入有序集合里面,那么这个成员就会被包含在输出有序集合里面。
在这里插入图片描述
使用场景

  1. 各种排名
    a) 热门帖子回复数前五
    b) 拥有好友数量排名
    c) 文章点赞数排名
  2. 数据分页(zrange/zrevrange key (page-1)* pageSize page*pageSize-1)
    a) Sorted set + String
    b) Sorted set + hash

3.6 其他命令

自增自减

在这里插入图片描述

排序

Redis 的排序操作和其他编程语言的排序操作一样,都可以根据某种比较规则对一系列元素进行有序的排列。负责执行排序操作的 SORT 命令可以根据字符串、列表、集合、有序集合、散列这5 种键里面存储着的数据,对列表、集合以及有序集合进行排序。其实就是类似MySQL中的 order by
在这里插入图片描述
使用 SORT 命令提供的选项可以实现以下功能:
根据降序而不是默认的升序来排序元素;将元素看作是数字来进行排序,或者将元素看作是二进制字符串来进行排序(比如排序字符串’110’和’12’的结果就跟排序数字 110 和 12的结果不一样);使用被排序元素之外的其他值作为权重来进行排序,甚至还可以从输入的列表、集合、有序集合以外的其他地方进行取值。

发布了79 篇原创文章 · 获赞 7 · 访问量 1826

猜你喜欢

转载自blog.csdn.net/weixin_45044097/article/details/103677135