Redis
上篇: Linux学习
1、什么是NoSQL
百度百科: https://baike.baidu.com/item/NoSQL/8828247?fr=aladdin
NoSQL(Not Only SQL),泛指非关系型的数据库。区别于关系数据库,它们不保证关系数据的ACID特性。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,特别是大数据应用难题。
2、NoSQL的分类
2.1、键值(Key-Value)存储数据库
这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署。但是如果数据库管理员(DBA)只对部分值进行查询或更新的时候,Key/value就显得效率低下了。举例如:Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB。
2.2、列存储数据库
这部分数据库通常是**用来应对分布式存储的海量数据。**键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。如:Cassandra, HBase, Riak.
2.3、文档型数据库
文档型数据库的灵感是来自于Lotus Notes办公软件的,而且它同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如 JSON。文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值,在处理网页等复杂数据时,文档型数据库比传统键值数据库的查询效率更高。如:CouchDB, MongoDb. 国内也有文档型数据库SequoiaDB,已经开源。
2.4、图形(Graph)数据库
图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。如:Neo4J, InfoGrid, Infinite Graph。
不同分类特点对比
分类 | Examples举例 | 典型应用场景 | 数据模型 | 优点 | 缺点 |
---|---|---|---|---|---|
键值(key-value) | Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB | 内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等。 | Key 指向 Value 的键值对,通常用hash table来实现 | 查找速度快 | 数据无结构化,通常只被当作字符串或者二进制数据 |
列存储数据库 | Cassandra, HBase, Riak | 分布式的文件系统 | 以列簇式存储,将同一列数据存在一起 | 查找速度快,可扩展性强,更容易进行分布式扩展 | 功能相对局限 |
文档型数据库 | CouchDB, MongoDB | Web应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容) | Key-Value对应的键值对,Value为结构化数据 | 数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构 | 查询性能不高,而且缺乏统一的查询语法。 |
图形(Graph)数据库 | Neo4J, InfoGrid, Infinite Graph | 社交网络,推荐系统等。专注于构建关系图谱 | 图结构 | 利用图结构相关算法。比如最短路径寻址,N度关系查找等 | 很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案。 |
3、NoSQL 特点
- 易扩展
- 大数据量,高性能
- 灵活的数据模型
- 高可用
4、什么是Redis?
中文网:https://www.redis.net.cn/
Redis (REmote DIctionary Server) ,即远程字典服务。
Redis 是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis 支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。
4.1、window 上安装 redis
1、下载压缩包
下载地址: https://github.com/microsoftarchive/redis/releases/tag/win-3.2.100
2、解压缩文件
3、开启Redis
双击 redis-server.exe
4、使用Redis客户端连接Redis
双击 redis-cli.exe
, 测试连接。
4.2、Linux 上安装Redis
1、下载安装包
官网下载: https://redis.io/
使用 Xftp 传到虚拟机上。
2、解压 Redis 的安装包(/opt 目录)
tar -zxvf [安装包名]
3、Redis 目录内的配置文件
4、基本环境安装
Redis 6 以上需要 gcc 版本在 7 以上
# 安装 gcc 依赖
yum install gcc
# -----运行下面命令升级gcc-----
# 第一步
sudo yum install centos-release-scl
# 第二步
sudo yum install devtoolset-7-gcc*
# 第三步
scl enable devtoolset-7 bash
# cd 切换到 redis解压目录下,执行编译命令
make
# 运行测试,确认Redis的功能是否正常
make test
报错:
CentOS 7 安装 tcl-8.5.13-8.el7.x86_64.rpm
# 1、下载 tcl-8.5.13-8.el7.x86_64.rpm
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/tcl-8.5.13-8.el7.x86_64.rpm
# 2、安装 tcl-8.5.13-8.el7.x86_64.rpm
rpm -ivh tcl-8.5.13-8.el7.x86_64.rpm
5、指定安装到某个目录
# 安装到指定的位置,PREFIX可指定安装目录,便于维护
make install PREFIX=/usr/local/redis
# cd /usr/local/redis/bin
# 查看 redis 的版本
./redis-server -v
6、修改 Redis 配置文件
将加压缩目录下的 redis.conf
文件复制到安装目录下新建的 config
目录下
修改 redis.conf 文件,把 daemonize no
改为 daemonize yes
(后台启动配置, 前台启动 ./redis-server
)
8、启动 Redis 服务测试
9、设置开机启动
vim /etc/systemd/system/redis.service # 写入以下内容
[Unit]
Description=redis-server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/bin/config/redis.conf # 安装目录 和 配置文件目录
PrivateTmp=true
[Install]
WantedBy=multi-user.target
设置开机启动
[root@localhost system]# systemctl daemon-reload
[root@localhost system]# systemctl start redis.service
[root@localhost system]# systemctl enable redis.service
Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /etc/systemd/system/redis.service.
客户端穿件软链接
ln -s /usr/local/redis/bin/redis-server /usr/bin/redis-server # 服务端
ln -s /usr/local/redis/bin/redis-cli /usr/bin/redis-cli # 客户端
服务操作命令
systemctl start redis.service #启动redis服务
systemctl stop redis.service #停止redis服务
systemctl restart redis.service #重新启动服务
systemctl status redis.service #查看服务当前状态
systemctl enable redis.service #设置开机自启动
systemctl disable redis.service #停止开机自启动
5、Redis 性能测试
redis 性能测试的基本命令如下:
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 值的数据大小 | 2 |
7 | -k | 1=keep alive 0=reconnect | 1 |
8 | -r | SET/GET/INCR 使用随机 key, SADD 使用随机值 | |
9 | -P | 通过管道传输 请求 | 1 |
10 | -q | 强制退出 redis。仅显示 query/sec 值 | |
11 | –csv | 以 CSV 格式输出 | |
12 | -l (L 的小写字母) | 生成循环,永久执行测试 | |
13 | -t | 仅运行以逗号分隔的测试命令列表。 | |
14 | -I(i 的大写字母) | Idle 模式。仅打开 N 个 idle 连接并等待。 |
# 主机为 127.0.0.1,端口号为 6379,执行的命令为 set,lpush,请求数为 10000,通过 -q 参数让结果只显示每秒执行的请求数
[root@localhost bin]# ./redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -n 10000 -q
SET: 43103.45 requests per second, p50=0.447 msec
LPUSH: 71428.57 requests per second, p50=0.487 msec
6、Redis 基本知识
1、redis默认有16个数据库,默认的使用的是第0个数据库
打开 redis.conf
文件
可以使用 SELECT <dbid>
命令在连接上指定数据库 id
[root@localhost config]# redis-cli
127.0.0.1:6379> select 2 # 切换数据库
OK
127.0.0.1:6379[2]> DBSIZE # 查看DB大小
(integer) 0
不同的数据库可以存不同的值。测试:
127.0.0.1:6379[2]> set name miabao
OK
127.0.0.1:6379[2]> DBSIZE
(integer) 1
127.0.0.1:6379[2]> select 1
OK
127.0.0.1:6379[1]> DBSIZE
(integer) 0
127.0.0.1:6379[1]> get name
(nil)
127.0.0.1:6379[1]> select 2
OK
127.0.0.1:6379[2]> get name
"miabao"
127.0.0.1:6379[2]>
清除当前数据库: flushdb
清除全部数据库的内容: flushall
127.0.0.1:6379[2]> keys * # 查看数据库中所有的 key
1) "name"
127.0.0.1:6379[2]> flushdb
OK
127.0.0.1:6379[2]> keys *
(empty array)
127.0.0.1:6379[2]>
Redis 为什么要用 6379 作为默认端口?
https://www.zhihu.com/question/20084750/answer/645322396
Redis 是单线程的!
阅读: https://baijiahao.baidu.com/s?id=1721818452566518496&wfr=spider&for=pc
Redis 为什么单线程还这么快?
1、误区一:高性能的服务器一定是多线程的?
2、误区二:多线程(CPU上下文切换)一定比单线程效率高!
核心: redis 是将所有的数据全部放在内存中的,所以说单线程去操作效率是最高的。多线程(CPU上下文切换:耗时的操作!),对于内存系统来说,如果没有上下文的切换效率就是最高的。