前言:
本笔记仅做学习与复习使用,不存在刻意抄袭。
给各位学友强烈推荐《遇见狂神说》他的整套Java学习路线使我获益匪浅!!!
如果你也是狂神的小迷弟,可以加我好友一起探讨学习。
目录
4.安装(因为Redis更适合在linux下使用,所以只有linux的安装版本)
Redis详细笔记
一、NoSQL概述
1、为什么要使用NoSQL
-
现在是大数据时代(一般的数据库已经解决不了的数据:大数据(海量存储和并行计算))
SQL => NoSQL
1、单机时代(如MySQL)的瓶颈
- 数据量太大,一个机器存不下
- 数据的索引<B+Tree>(MySQL单表300万条数据,一定要建立索引),一个机器内存放不下
- 访问量大(MySQL读写混合 — 性能降低),一个服务器承受不了
2、Memcached缓存(减轻服务器的压力) + MySQL + 垂直拆分(读写分离,多个MySQL服务器,有的值负责读,有的值负责写)
发展过程:①优化数据结构和索引 => ②文件缓存(涉及IO操作)=> ③Memcached
Not Only SQL —> 非关系型数据库
NoSQL特点
-
方便扩展(数据之间没有关系)
-
大数据高性能(Redis一秒写8万次,读取11万次,NoSQL的缓存记录级,是一种细粒度的缓存,性能比较高)
-
数据类型是多样性的(不需要事先设计数据库(因为数据量大),随取随用)
-
传统RDBMS和NoSQL
-
传统RDBMS
- 结构化组织
- SQL
- 数据和关系都存在单独的表中
- 操作,数据定义语言
- 严格的一致性
- 基础的事务
- …
-
NoSQL
- 不仅仅是SQL
- 没有固定的查询语句
- 键值对存储,列存储,文档存储,图形数据库(社交关系)
- 最终一致性
- CAP定理和BASE
- 高性能,高可用,高可扩
- …
-
了解:3V + 3高
大数据时代的3V:主要是描述问题的
- 海量Volume
- 多样Variety
- 实时Velocity
大数据时代的3高:主要是对程序的要求
- 高并发
- 高可拓(集群)
- 高性能
电商网站:
# 1、商品的基本信息
名称、价格、商家信息:
关系型数据库: MySQL / Oracle (王坚:阿里去IOE(IBM小型机,Oracle数据库、EMC存储器))
# 2、商品的描述、评论(文字多)
文档型数据库:MongoDB
# 3、图片
分布式文件系统:FastDFS、TFS(淘宝)、GFS(Google)、HDFS(Hadoop)、OSS云存储(阿里云)
# 4、商品的关键字(搜索)
搜索引擎:solr、ElasticSearch、ISearch(阿里:多隆)
# 5、商品热门的波段信息
内存数据库:Redis、Tair、Memcached、...
# 6、商品的交易、外部的接口
三方应用
3、NoSQL的四大分类
- 新浪:Redis
- 美团:Redis + Tair
- 阿里、百度:Redis + Memcached
- MongoDB(必须掌握)
- 基于分布式文件存储的数据库(C++编写)
- 主要用于处理大量的文档
- 介于关系型数据库和非关系型数据库中的中间产品
- ConthDB
- HBase
- 分布式文件系统
- 存关系的,不是存图片的(比如,朋友圈社交网络,广告推荐)
- Neo4j、InfoGrid
二、Redis入门
1.Redis是什么
官网:redis.io
中文网:CRUG网站
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作<mark>数据库</mark>、<mark>缓存</mark>和<mark>消息中间件</mark>。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储(多样的数据结构)。
- Redis支持数据的备份,即master-slave模式的数据备份。
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。(但是Redis事务多操作不支持原子性—当我们执行后有语句有错,其他语句仍然可以正常执行,<mark>详情看事务</mark>)
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
- Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
2.能干什么?
- 内存存储、持久化(rdb,aof)
- 效率高、可以用于高速缓存
- 发布订阅系统
- 地图信息分析
- 计时器、计数器(浏览量)
- …
3.特性
- 多样的数据结构
- 持久化
- 集群
- 事务
- …
4.安装(因为Redis更适合在linux下使用,所以只有linux的安装版本)
linux 使用的系统是 Centos 7.3
你可使用 虚拟机,也可已使用云服务器(学生机不贵),因为我有服务器,这里就在服务器上安装和学习Redis
①下载安装包
②加压安装包(提前使用xshell和xftp上传压缩包到服务器上)
压缩包在 /app/目录下
在/usr/local/ 下创建redis文件夹,并进入到文件夹中
解压压缩包到该文件夹下
tar -zxvf /app/redis-6.0.6.tar.gz -C ./
③编译并安装(保证安装了编译环境)
没有安装编译环境,需要 yum install gcc-c++
如果下面操作报错:需要提升GCC的版本(redis6需要5.3+)
//升级gcc到9以上 yum -y install centos-release-scl yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils //临时将此时的gcc版本改为9 scl enable devtoolset-9 bash //或永久改变 echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
cd redis-6.0.6
make && make install
编译后,默认安装路径在 /usr/local/bin
④安装系统服务并后台启动
可能会报错:
解决方法:vim install_server.sh,注释如下图内容
安装系统服务(可以指定选项,下面默认)
cd utils
./install_server.sh
默认的配置文件:/etc/redis/6379.conf(安装成功后,默认后台自启)
⑤开启redis服务
可以使用自定义的配置文件开启,这里使用systemctl
/redis安装目录/redis-server /配置文件目录/redis.conf
# 关闭服务
/redis安装目录/redis-cli shutdown
systemctl start redis_6379.service
⑥客户端连接测试
⑦设置远程连接
vim /etc/redis/6379.conf
然后重启服务即可:
systemctl restart redis_6379.service
⑧配置访问密码
vim /etc/redis/6379.conf
重启服务
systemctl restart redis_6379.service
客户端连接测试
关闭连接
5.性能测试
使用自带的
redis-benchmark
工具测试即可
redis-benchmark [option] [option value]
性能测试工具可选参数:
序号 | 选项 | 描述 | 默认值 |
---|---|---|---|
1 | -h | 指定服务器主机名 | 127.0.0.1 |
2 | -p | 指定服务器端口 | 6379 |
3 | -s | 指定服务器 socket | |
4 | -c | 指定并发连接数 | 50 |
5 | -n | 指定请求数 | 10000 |
6 | -d | 以字节的形式指定 SET/GET 值的数据大小 | 3 |
7 | -k | 1=keep alive 0=reconnect | 1 |
8 | -r | SET/GET/INCR 使用随机 key, SADD 使用随机值 | |
9 | -P | 通过管道传输 \<numreq> 请求 | 1 |
10 | -q | 强制退出 redis。仅显示 query/sec 值 | |
11 | —csv | 以 CSV 格式输出 | |
12 | -l | 生成循环,永久执行测试 | |
13 | -t | 仅运行以逗号分隔的测试命令列表。 | |
14 | -I | Idle 模式。仅打开 N 个 idle 连接并等待。 |
# 测试:100个并发连接 100000请求
redis-benchmark -c 100 -n 100000
6.基本知识说明(基本命令)
如果觉得这里命令不太好看,去这个博客https://www.cnblogs.com/wlandwl/p/redis.html,或者 官网:Redis命令中心(Redis commands) -- Redis中国用户组(CRUG)
注意:以下的所有key都表示对应数据类型的 键的名称
; value表示存储的值
(除非注释中有特殊说明)
1.Redis 有16个数据库(0~15),默认使用第0个
可以使用
select
进行切换
2.查看数据库大小
使用
dbsize
查看数据库大小
使用
keys *
flushdb
flushall
略
- Redis是很快的,官方表示,Redis是基于内存操作,CPU不是Redis的性能瓶颈,Redis的性能瓶颈是根据机器的<mark>内存</mark>和<mark>网络的带宽</mark>,既然可以使用单线程,就不用使用多线程。(<mark>6.0后支持多线程</mark>)
exists
key
8.移除key
move
key 1 // 1表示当前数据库
del
key // 删除当前数据库的key(可以多个)
expire
key 时间 // 单位时间为s
ttl
key // 查看剩余存活时间
10.查看当前key的类型
type
key
append
key appendValue
- <mark>如果当前 key 不存在,作用相当于 set key</mark>
12.获取字符串长度(String)
strlen
key
incr
key
decr
key
incrby
key 步长
decrby
key 步长
14.字符串片段 Range (String)
getrange
key startIndex endIndex
- 对应java里的substring(<mark>但是这里会endIndex是一个闭区间</mark>)
- 特例,endIndex = -1 时,表示从startIndex 到最后
15.字符串替换 (String)
setrange
key index replaceString
- 对应java里的replace
- 注意,如果replaceString是一个字符串,那么会替换源字符串中index后replaceString长度的片段,结果如下
16.特殊set设置 (String)