一、NoSQL
NoSQL 是 Not Only SQL 的缩写,意即"不仅仅是 SQL"的意思,泛指非关系型的数据库。强调 Key-Value Stores 和文档数据库的优点。
NoSQL 产品是传统关系型数据库的功能阉割版本,通过减少用不到或很少用的功能,来大幅度提高产品性能
·不遵循 SQL 标准。 (添加 insert 修改 update )
·不支持 ACID。
·远超于 SQL 的性能。
1.NoSQL的起源
NoSQL(Not Only SQL)是一种非关系型数据库管理系统的范畴,起源于互联网公司对于大数据处理和高可扩展性需求的追求。以下是NoSQL起源的简要描述:
1.高负载互联网应用:随着互联网的迅猛发展,一些大型网络平台、社交媒体和电子商务网站等面临着大量的数据存储和高并发访问的问题。传统关系型数据库在应对这类场景时遇到了挑战,因为它们常常基于ACID特性,对于数据结构和规模的灵活性和可扩展性有限。
2.大数据需求:随着互联网应用和物联网设备的普及,数据量呈指数级增长。传统关系型数据库面临处理大规模数据集和快速读写的瓶颈,需要更高效的解决方案。
3.分布式计算和云计算:分布式计算和云计算技术的兴起也促进了NoSQL数据库的发展。NoSQL数据库适应了分布式环境,能够水平扩展和并行处理,带来更好的性能和可伸缩性。
4.数据模型创新:为了满足互联网应用的多样化需求,NoSQL数据库引入了不同的数据模型,例如键值存储、文档存储、列存储和图形数据库等。这些新的数据模型提供了更灵活的数据结构和查询方式。
5.NoSQL运动:2009年,NoSQL成为一个独立的概念,并聚集了一些开源项目和公司的努力。很多互联网公司开始采用或开发自己的NoSQL数据库解决方案,推动了NoSQL运动的兴起。
总之,NoSQL起源于对大数据处理需求和传统关系型数据库的局限性,旨在提供更高效、可扩展和灵活的数据存储和管理方案,适应了当今互联网时代的挑战和需求。
2.NoSQL的使用
2.1NoSQL特性
·灵活的数据模型
·海量数据的读写
·高性能和可伸缩性
·高可用性和容错性
2.2NoSQL不适用场景
·需要事务支持
·基于 sql 的结构化查询存储,处理复杂的关系,需要关系查询。
用不着 sql 的和用了 sql 也不行的情况,考虑用 NoSql
3.常见的NoSQL及区别
3.1常见的NoSQL数据库
临时性键值存储 | 永久性键值存储 | 面向文档的数据库 | 面向列的数据库 |
Memcached | Tokyo Tyrant | MangoDB | Cassandra |
Rendis | Flare | CouchDB | HBase |
ROMA | HyperTable |
||
Redis |
3.2区别
Memcached
·很早出现的NoSQL数据库
·数据都在内存中,一般不持久化
·支持简单的 key-value 模式,支持类型单一
·一般是作为缓存数据库辅助持久化的数据库(MySQL)
Redis
·几乎覆盖了 Memcached 的绝大部分功能
·数据都在内存中,支持持久化,主要用作备份恢复
·除了支持简单的 key-value 模式,还支持多种数据结构的存储,比如 list、set、hash、zset 等。
·一般是作为缓存数据库辅助持久化的数据库
MongoDB
·高性能、开源、模式自由(schema free)的文档型数据库
·数据都在内存中, 如果内存不足,把不常用的数据保存到硬盘
·虽然是 key-value 模式,但是对 value(尤其是 json)提供了丰富的查询功能
·支持二进制数据及大型对象
·可以根据数据的特点替代 RDBMS,成为独立的数据库。或者配合 RDBMS,存储特定的数
二、Redis
1.Redis简介
·Redis 是一个开源的 key-value 存储系统。
·和 Memcached 类似,它支持存储的 value 类型相对更多,包括 string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和 hash(哈希类型)。
·这些数据类型都支持 push/pop、add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
·在此基础上,Redis 支持各种不同方式的排序。
·与 memcached 一样,为了保证效率,数据都是缓存在内存中。
·区别的是 Redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。
·并且在此基础上实现了 master-slave(主从)同步。
2.Redis的应用场景
2.1数据缓存(提高访问性能)
查询概率》》 增删改的概率
将一些数据在短时间之内不会发生变化,而且它们还要被频繁访问,为了提高用户的请求速度和降低网站的负载,降低数据库的读写次数,就把这些数据放到缓存中。
2.2会话缓存
session cache,主要适用于 session 共享 (string 类型)
2.3排行榜/计数器
(NGINX+lua+redis 计数器进行 IP 自动封禁)(zset)
2.4消息队列
(构建实时消息系统,聊天,群聊) (list)
2.5粉丝 (set)
2.6用于存储对象 (hash)
面试题
string :会话信息
list:消息
set:粉丝 共同好友
zset :排行榜
hash: 存储对象
三、Redis的安装及启动停止
1.下载redis的安装包
命令: wget https://download.redis.io/releases/redis-5.0.14.tar.gz
2.安装redis所依赖的环境
命令: yum -y install gcc-c++
3.解压redis压缩包
命令: tar -zxvf redis-5.0.14.tar.gz
4.编译
a.进入redis解压目录
命令: cd redis-5.0.14
b.执行make命令编译
命令: make
5.安装redis
命令: make PREFIX=/usr/redis install (如果不加prefix 默认安装到/usr/local下面)
(如果命令执行不成功,换为 make install PREFIX=/usr/redis )
6.查看redis安装位置
命令: which redis-server
7.启动redis
a.进入安装目录的bin目录下,顺便查看一下是否拥有权限
命令: cd /usr/redis/bin/
b.启动redis
命令: ./redis-server
出现上图即为安装成功
redis启动成功,但是这种启动方式需要一直打开窗口,不能进行其他操作,不太方便
按ctrl+c可以关闭窗口
8.修改配置文件
8.1拷贝配置文件到安装目录的bin下
命令: cp /usr/redis/redis-5.0.14/redis.conf /usr/redis/bin
8.2修改redis.conf文件
a.设置后台启动
不想设置后台启动可以不改
b.设置密码
requirepass 密码
如果需要客户端连接需要设置密码,不需要连接就不需要设置
c.设置远程连接
命令1: #bind 127.0.0.1
#注释掉绑定本机,才可以远程连接访问
命令2: bind 0.0.0.0
所有的都可以连接
d.关闭保护模式
protected-mode no
9.启动redis
因为第八步里面直接把redis.conf文件拷贝过来,所以可以直接两个文件一起运行
命令: ./redis-server ./redis.conf
10.连接redis
命令: ./redis-cli -a 密码
11.退出redis
命令: exit
12.关闭redis
命令:./redis-cli shutdown
./redis-cli -p 6379 -a wsl -h 127.0.0.1 shutdown
13.配置开机启动文件
vim /lib/systemd/system/redis.service
[Unit]
Description=Redis
After=network.target
[Service]
ExecStart=/usr/redis/bin/redis-server /usr/redis/bin/redis.conf
ExecStop=/usr/redis/bin/redis-cli -h 127.0.0.1 -p 6379 -a wsl shutdown
[Install]
WantedBy=multi-user.target
刚刚配置的服务需要让 systemctl 能识别,就必须刷新配置
systemctl daemon-reload 刷新配置
systemctl enable redis 开机自启
systemctl status redis redis 状态
systemctl start redis 开启 redis
systemctl stop redis 关闭 redis
systemctl disable redis 禁止开机自启
14.使用客户端连接radis
打开Another Redis Desktop Manager建立连接
Host是你的ip地址 Port是redis端口 Password是你设置的密码
成功连接
四、连接radis
使用radis-cli连接radis
当你设置完密码后有两种进入方式
先进入目录cd /usr/radis/bin
①先输入命令: ./radis-cli 进入 ---注意这是你还不能进行操作
再输入密码: auth 密码 ---此时才可以开始操作
②直接输入命令: ./radis-cli -a 密码
五、Key
1.查看数据库
默认 16 个数据库,类似数组下标从 0 开始,初始默认使用 0 号库
查看数据库命令: config get databases
2.获取当前库中的所有key
命令: keys *
3.查看当前数据库的 key 的数量
命令: dbsize
4.选择库
命令: select 目标数据库
5.清空当前库
命令: flushdb
6.通杀所有库
命令:flushall (不建议使用)
7.移动数据
将当前的数据库 key 移动到某个数据库,目标库有,则不能移动
命令: move [key] 目标数据库
我们可以很清楚的看到0号数据库的第一个name移动到了1号数据库
而第二个name明显没有移动成功
8.从当前数据库中随机返回key
命令: randomkey
9.查看key的类型
命令: type [key]
10.删除key
命令: del [key]
11.判断是否存在 key
命令: exists [key]
12.为给定的key设置过期时间
命令: expire [key] num 单位是秒
命令: pexpire [key] num 单位是毫秒
13.删除key的过期时间
命令: persist [key]
14.查看还有多少秒过期
命令:ttl [key]
-1 表示永不过期,-2 表示已过期
六、常见的数据类型
1.string类型
1.1简介
String是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象。
String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M
1.2.常用命令
1.2.1添加键值对
命令: set <key><value>
*NX:当数据库中key不存在时,可以将key-value添加数据库
*XX:当数据库中key存在时,可以将key-value添加数据库,与NX参数互斥
*EX:key的超时秒数
*PX:key的超时毫秒数
1.2.2取值
查询对应键值
命令: get <key>
1.2.3以新换旧
设置了新值同时获得旧值。
命令: getset <key><value>
批量操作
1.2.4批量设置key
命令: mset key1 key2
同时设置一个或多个 key-value 对,当且 仅当所有给定 key 都不存在 如果有一个存在就会不成功。
注意:有一个失败则都失败
1.2.5批量获取
命令: mget key1 key2
1.2.6替换
从 index 开始替换 value
命令: setrange <key><起始位置index><value>
1.2.7获取
命令: getrange <key><起始位置><结束位置>
1.2.8追加
将给定的<value> 追加到原值的末尾
命令: append <key><value>
1.2.9获得值的长度
命令: strlen <key>
1.2.10增值
将 key 中储存的数字值增1
只能对数字值操作,如果为空,新增值为1
命令: incr <key>
1.2.11减值
将 key 中储存的数字值减1
只能对数字值操作,如果为空,新增值为-1
命令: decr <key>
1.2.12递增递减
将 key 中储存的数字值增减。自定义步长。
命令: incrby / decrby <key><步长>
示例: incrby age 10 递增
示例: decrby age 10 递减
1.3.数据结构
String的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。是可以修改的字符串,内部结构实现上类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。
如图中所示,内部为当前字符串实际分配的空间capacity一般要高于实际字符串长度len。当字符串长度小于1M时,扩容都是加倍现有的空间(2倍),如果超过1M,扩容时一次只会多扩1M的空间。需要注意的是字符串最大长度为512M。
2.list类型
2.1简介
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
2.2常用命令
2.2.1添加
从左边/右边插入一个或多个值。
命令: lpush/rpush <key> <value1><value2><value3> ....
2.2.2取值
按照索引下标获得元素(从左到右)
命令: lrange <key> <start> <stop>
命令: lrange list1 0 -1
0左边第一个,-1右边第一个,(0 -1表示获取有)
2.2.3消值
从左边/右边吐出一个值。值在键在,值光键亡。
命令: lpop/rpop <key>
2.2.4移值
从<key1>列表右边吐出一个值,插到<key2>列表左边
命令: rpoplpush <key1><key2>
2.2.5 获取集合列表长度
命令: llen <key>
2.2.6按照索引下标获得元素(从左到右)
命令: lindex <key> <index>
2.2.7删除
从左边删除n个对应的value值(从左到右)
命令: lrem <key> <n> <value>
注:当列表key中没有删除值是则删除失败
2.2.8替换
将列表key下标为index的值替换成value
命令: lset <key> <index> <value>
2.3数据结构
List的数据结构为快速链表quickList。
首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是压缩列表。(它将所有的元素紧挨着一起存储,分配的是一块连续的内存)。当数据量比较多的时候才会改成quicklist。
因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里存的只是int类型的数据,结构上还需要两个额外的指针prev和next。
Redis将链表和ziplist结合起来组成了quicklist。也就是将多个ziplist使用双向指针串起来使用。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。
3.hash类型
3.1简介
hash是一个string类型的field和value的映射表,hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。类似Java里面的Map<String,Object>
用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,如果用普通的key/value结构来存储
主要有以下2种存储方式:
而我们可以通过第三种方式hash:( key(用户ID) + field(属性标签)) 就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题。
3.2常用命令
3.2.1添加
给<key>集合中的 <field>键赋值<value>
命令: hset <key><field><value>
3.2.2取值
从<key1>集合<field>取出 value
命令: hget <key1><field>
3.2.3获取所有属性
列出该hash集合的所有field
命令: hkeys <key>
3.2.4获取所有值
列出该hash集合的所有value
命令: hvals <key>
3.2.5查找属性
命令: hexists<key1><field>
3.2.6为value加值
为哈希表 key 中的域 field 的值加上增量 1 -1
命令: hincrby <key><field><increment>
3.3数据结构
Hash类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable。
ZipList 是一种特殊的“双端链表” ,由一系列特殊编码的连续内存块组成
。可以在任意一端进行压入/弹出操作
4.set类型
4.1简介
set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
4.2常用命令
4.2.1添加
将一个或多个 member 元素加入到集合 key 中,已经存在的 member 元素将被忽略
命令: sadd <key><value1><value2> .....
4.2.2取值
取出该集合的所有值
命令: smembers <key>
4.2.3判断是否含有该值
判断集合<key>是否为含有该<value>值,有1,没有0
命令: sismember <key><value>
4.2.4返回该集合的元素个数
命令: scard <key>
4.2.5删除
删除集合中的某个元素
命令: srem <key><value1><value2>
4.3数据结构
Set数据结构是dict字典,字典是用哈希表实现的。
Java中HashSet的内部实现使用的是HashMap,只不过所有的value都指向同一个对象。Redis的set结构也是一样,它的内部也使用hash结构,所有的value都指向同一个内部值。
5.SortedSe(zset)类型
5.1简介
Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。
不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 。
因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。
访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。
5.2常用命令
5.2.1添加
将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
命令: zadd <key><score1><value1><score2><value2>…
5.2.2取值
返回有序集 key 中,下标在<start><stop>之间的元素
带WITHSCORES,可以让分数一起和值返回到结果集。
命令: zrange <key> <start> <stop> [WITHSCORES]
5.2.3排序
返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
命令: zrangebyscore key min max [withscores] [limit offset count]
反向排序:
zrevrangebyscore key max min [withscores] [limit offset count]
同上改为从大到小排序
5.3数据结构
SortedSet(zset)是Redis提供的一个非常特别的数据结构,一方面它等价于Java的数据结构Map<String, Double>,可以给每一个元素value赋予一个权重score,另一方面它又类似于TreeSet,内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过score的范围来获取元素的列表。
zset底层使用了两个数据结构
(1)hash,hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值。
(2)跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。
数据结构之跳表_跳表几级_所幸你是例外的博客-CSDN博客
对比有序链表和跳跃表,从链表中查询出51
(1) 有序链表
要查找值为51的元素,需要从第一个元素开始依次查找、比较才能找到。共需要6次比较。
(2) 跳跃表
从第2层开始,1节点比51节点小,向后比较。
41节点比51节点小,继续向后比较,后面就是NULL了,所以从41节点向下到第1层
在第1层,41节点比51节点小,继续向后,61节点比51节点大,所以从61向下
在第0层,51节点为要查找的节点,节点被找到,共查找4次。
6.各数据的使用场景
类型 |
简介 |
特性 |
场景 |
String(字符串) |
二进制安全 |
可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M |
--- 存token 验证码 |
Hash(字典) |
键值对集合,即编程语言中的Map类型 |
适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去) |
存储、读取、修改用户属性 |
List(列表) |
链表(双向链表) |
增删快,提供了操作某一段元素的API |
1、最新消息排行等功能(比如朋友圈的时间线) 2、消息队列 |
Set(集合) |
哈希表实现,元素不重复 |
1、添加、删除、查找的复杂度都是O(1) 2、为集合提供了求交集、并集、差集等操作 |
1、共同好友 2、利用唯一性,统计访问网站的所有独立ip |
Sorted Set(有序集合) |
将Set中的元素增加一个权重参数score,元素按score有序排列 |
数据插入集合时,已经进行天然排序 |
1、排行榜文章来源:https://www.toymoban.com/news/detail-719431.html 2、带权重的消息队列文章来源地址https://www.toymoban.com/news/detail-719431.html |
到了这里,关于Linux-Xshell-Redis的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!