热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Redis(非关系型数据库)

redis理论知识redis:非关系型数据库基于键值对的形式存储数据的查询效率非常的高没有表之间的约束查询起来比较方便redis特点:1.支持多种数据类型2.支持分布式存储3.功能




redis理论知识

redis:
非关系型数据库 基于键值对的形式存储数据的
查询效率非常的高 没有表之间的约束 查询起来比较方便
redis特点:
1.支持多种数据类型
2.支持分布式存储
3.功能集比较丰富
4.开源(有很多人进行优化)
缓存:
缓存静态数据(squid varnish(提高用户的访问速度))
对于动态数据而言,所有的请求都在数据库上(主从) 从而减轻数据库压力
为了让数据库能够更好的减轻压力,使用redis作为缓存 ,缓存动态数据
怎么缓存动态数据(读写分离)
写入数据的时候写入mysql 读取数据在redis上 如果客户端的请求,在redis上未命中,则去后端进行查询,并由后端反馈给客户端,在反馈同时也会给redis发送一份,从而让redis进行缓存,缓存时缓存的是key value,客户端查询key(select 。。。)结果value。

redis支持比较小的数据

有周期性的 需要设置时间

redis先将数据缓存在内存中,可以通过周期,把缓存在内存中内容通过AOF和RDB的形式写入到硬盘当中(数据不会丢失)需要更新

redis中缓存的数据:
1.不会经常修改的数据 用户信息 商品的简介 商品的分类
2.查询比较高效率的 也要存放在里面 提高用户访问的速度

什么时候不太适合用缓存? 需要和数据库强一致性

redis的遇到的问题
redis出现穿透:
当请求是不正常的请求,redis查询不到对应的数据,直接去数据库上去请求,会让数据库不太安全

去查找解决方式
1.拒绝连接
redis出现雪崩:
当请求量过于大,redis查询的时间长,积压了很多请求,redis宕机,对于redis所有的请求全部到了mysql。
2.设置当前的最大连接

redis的常用命令:
select 切换数据库 redis默认有16个数据库 (0-15)
set 创建键值对 对于键值对存在这种情况 会直接覆盖
set key value
get 查看指定的键值对
get key
mset 批量创建键值对
mset key1 value key2 value
append 对指定的键的值的内容进行追加
apppend key append value
keys* 查看所有数据库的键
dbsize 统计数据库键的个数
move 对键值对进行迁移
move key db
del 删除指定的键值对 可以是多个
del key1 key2
flushall 清除数据库中所有的键值对

redis缓存LNMP
需要具备一体化LNMP一台,在此基础上进行操作


主机ip
redis192.168.10.20

[root@localhost ~]# vim /usr/local/php/etc/php-fpm.conf
151 listen = 192.168.10.20:9000
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
67 fastcgi_pass 192.168.10.20:9000;
[root@localhost ~]# killall -9 nginx
[root@localhost ~]# nginx
[root@localhost ~]# systemctl restart php-fpm

安装redis服务

[root@localhost ~]# tar -zxf redis-4.0.6.tar.gz -C /usr/src/
[root@localhost ~]# mv /usr/src/redis-4.0.6/ /usr/local/redis
[root@localhost ~]# cd /usr/local/redis/
[root@localhost redis]# make && make install
[root@localhost redis]# vim redis.conf
69 bind 192.168.10.20 #本机的ip
136 daemonize yes
[root@localhost redis]# redis-server /usr/local/redis/redis.conf #启用redis服务
76430:C 04 Dec 15:11:47.527 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
76430:C 04 Dec 15:11:47.527 # Redis version=4.0.6, bits=64, commit=00000000, modified=0, pid=76430, just started
[root@localhost redis]# netstat -anput | grep redis
tcp 0 0 192.168.10.20:6379 0.0.0.0:* LISTEN 76431/redis-server

[root@localhost redis]# redis-cli -h 192.168.10.20 -p 6379 #登入redis数据库
192.168.10.10:6379> SELECT 0 #切换数据库,默认有16个数据库(0-15)
OK
以下为一些常用命令的演示:
192.168.10.20:6379> SET name one
OK
192.168.10.20:6379> GET name
"one"
192.168.10.20:6379> keys *
1) "name"
192.168.10.20:6379> dbsize
(integer) 1
192.168.10.20:6379> MSET test rr test1 tt
OK
192.168.10.20:6379> DBSIZE
(integer) 3
192.168.10.20:6379> MOVE name 2
(integer) 1
192.168.10.20:6379> DBSIZE
(integer) 2
192.168.10.20:6379> FLUSHALL #清除数据库中所有的键值对
OK

lnmp上打redis模块

[root@localhost ~]# unzip phpredis-master.zip
[root@localhost ~]# cd phpredis-master/
[root@localhost phpredis-master]# ls
common.h debian library.c php_redis.h redis_session.c tests
config.m4 debian.control library.h README.markdown redis_session.h
CREDITS igbinary mkdeb-apache2.sh redis.c serialize.list
[root@localhost phpredis-master]# ln -s /usr/local/php/bin/* /usr/local/bin/
[root@localhost phpredis-master]# ln -s /usr/local/php/sbin/* /usr/local/sbin/
[root@localhost phpredis-master]# phpize #如果这里执行不成功 如果报错 需要安装依赖关系autoconf
Configuring for:
PHP Api Version: 20170718
Zend Module Api No: 20170718
Zend Extension Api No: 320170718
[root@localhost phpredis-master]# ./configure --with-php-cOnfig=/usr/local/php/bin/php-config && make && make install
[root@localhost phpredis-master]# cd /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/
[root@localhost no-debug-non-zts-20090626]# ls
redis.so
[root@localhost no-debug-non-zts-20090626]# vim /usr/local/php/php.ini
#最后一行添加
extension = redis.so
[root@localhost no-debug-non-zts-20090626]# systemctl restart php-fpm
[root@localhost no-debug-non-zts-20090626]# firefox 192.168.10.20/index.php #redis模块应该是打入到PHP中了

在这里插入图片描述

[root@localhost ~]# mysql -uroot -p
mysql> create database abc;
mysql> use abc;
mysql> create table test(id int,name varchar(10));
mysql> insert into test values(1,"one"),(2,"two"),(3,"three"),(4,"four"),(5,"five");
mysql> select * from test;
mysql> grant all on abc.test to "root"@"192.168.10.20" identified by "123.com";
mysql> flush privileges;
[root@localhost ~]# cd /usr/local/nginx/html/
[root@localhost html]# vim index.php
$redis=new Redis;
$redis->connect("192.168.10.20",6379) or die ("could not connect"); #redis连接的ip
$query="select * from abc.test limit 5"; #查询限制到5
for ($key=1;$key<=5;$key++) {
if (!$redis->get($key)) { #如果没有在redis获取到值
$cOnn=mysql_connect("192.168.10.20","root","123.com"); #就直接连接数据库
$result=mysql_query($query); #结果直接输出
while ($row=mysql_fetch_assoc($result)) {
$redis->set($row["id"],$row["name"]); #并且缓存在redis当中
}
break; #正常结束
}
else {
$name="redis";
$data[$key]=$redis->get($key); #将redis的值直接输出
}
}
echo $name; #redis输出格式
echo "
";
for ($key=1;$key<=5;$key++) {
echo "id is $key";
echo "
";
echo "name is $data[$key]";
echo "
";
}
?>
[root@localhost html]# firefox 192.168.10.20/index.php
[root@localhost html]# redis-cli -h 192.168.10.20 -p 6379
192.168.10.20:6379> keys *
1) "5"
2) "4"
3) "2"
4) "3"
5) "1"

redis集群

redis可以做分布式存储 集群
也就是在一台主机不够mysql缓存 可以使用多台组合在一起,形成一个集群,以便于更好的存储
redis的集群 最少需要3个节点 3个节点为了其安全 还需要3个备份
每个节点之间的地位都是平等的 每个上面都有连接

redis集群的原理:
redis是通过hash槽点来进行分配数据的
redis总共有16384个槽点(0-16383)
将这些槽点平均的分配到每台主节点上,只有有槽点的主节点才会进行工作,主节点上有槽点,从节点上没有槽点,当主节点宕机,那么槽点会迁移,迁移到从节点上,从节点就变为主节点。当主修好添加添加回集群,就变成从节点 (槽点在哪里,数据就在哪里)
数据算法 crc16(key) % 16383 = 100(将会储存到第一个主节点)
第一个redis主节点 (0-5461)

缓存流程:
客户端发送请求(key),redis(集群)crc16算法,当前这个请求的数据会在那一台主机上,假如是第一个主节点,如果第一个主节点上有匹配到的数据 则直接返回,如果没有,则将请求交给后端mysql,mysql直接给客户端回应,在给客户端回应的同时,会将数据发送给redis第一个主机点一份,主节点进行保存,这样这个key就会有一个value,等到下一个客户端如果有一样请求,就会直接返回

redis如果使用多台主机做集群
需要注意,将从节点不要和其主机点放在一台主机上,这样会造成,如果整个物理机坏掉,那么数据也会丢失,交叉排放就是为了当其中一个物理机坏掉时,整个数据都还存在

实验:
为了方便起见我们通过多开端口 来启动6个redis
一台主机启动6个节点,3个主节点,3个从节点
安装redis(上面写过具体操作就不再写了)

[root@localhost ~]# killall -9 redis-server #如果前面启用过redis则先killall杀死一下,如果没有则忽略这条命令
[root@localhost ~]# mkdir /usr/local/cluster
[root@localhost ~]# cd /usr/local/cluster/
[root@localhost cluster]# mkdir {7000..7005}
[root@localhost cluster]# cp /usr/local/redis/redis.conf 700
[root@localhost cluster]# cp /usr/local/redis/redis.conf 7000/
[root@localhost cluster]# vim 7000/redis.conf
69 bind 192.168.10.20 #监听的ip
92 port 7000 #端口
136 daemonize yes #后台运行
672 appendonly yes #开启aof持久化
676 appendfilename "appendonly-7000.aof" ##aof持久化生成的文件名
814 cluster-enabled yes #开启集群功能
822 cluster-config-file nodes-7000.conf ##集群节点的配置文件
828 cluster-node-timeout 5000 #集群节点之间连接超时的时间
[root@localhost cluster]# cp 7000/redis.conf 7001/
[root@localhost cluster]# cp 7000/redis.conf 7002/
[root@localhost cluster]# cp 7000/redis.conf 7003/
[root@localhost cluster]# cp 7000/redis.conf 7004/
[root@localhost cluster]# cp 7000/redis.conf 7005/
[root@localhost cluster]# sed -i "s/7000/7001/g" 7001/redis.conf
[root@localhost cluster]# cat 7001/redis.conf | grep 7001
port 7001
appendfilename "appendonly-7001.aof"
cluster-config-file nodes-7001.conf
[root@localhost cluster]# cat 7002/redis.conf | grep 7002
port 7002
appendfilename "appendonly-7002.aof"
cluster-config-file nodes-7002.conf
[root@localhost cluster]# sed -i "s/7000/7003/g" 7003/redis.conf
[root@localhost cluster]# cat 7003/redis.conf | grep 7003
port 7003
appendfilename "appendonly-7003.aof"
cluster-config-file nodes-7003.conf
[root@localhost cluster]# sed -i "s/7000/7004/g" 7004/redis.conf
[root@localhost cluster]# cat 7004/redis.conf | grep 7004
port 7004
appendfilename "appendonly-7004.aof"
cluster-config-file nodes-7004.conf
[root@localhost cluster]# sed -i "s/7000/7005/g" 7005/redis.conf
[root@localhost cluster]# cat 7005/redis.conf | grep 7005
port 7005
appendfilename "appendonly-7005.aof"
cluster-config-file nodes-7005.conf
#启动
[root@localhost cluster]# redis-server 7000/redis.conf
[root@localhost cluster]# redis-server 7001/redis.conf
[root@localhost cluster]# redis-server 7002/redis.conf
[root@localhost cluster]# redis-server 7003/redis.conf
[root@localhost cluster]# redis-server 7004/redis.conf
[root@localhost cluster]# redis-server 7005/redis.conf
[root@localhost cluster]# netstat -anput | grep redis-server
tcp 0 0 192.168.10.20:17002 0.0.0.0:* LISTEN 82477/redis-server
tcp 0 0 192.168.10.20:17003 0.0.0.0:* LISTEN 82482/redis-server
tcp 0 0 192.168.10.20:17004 0.0.0.0:* LISTEN 82487/redis-server
tcp 0 0 192.168.10.20:17005 0.0.0.0:* LISTEN 82492/redis-server
tcp 0 0 192.168.10.20:7000 0.0.0.0:* LISTEN 82467/redis-server
tcp 0 0 192.168.10.20:7001 0.0.0.0:* LISTEN 82472/redis-server
tcp 0 0 192.168.10.20:7002 0.0.0.0:* LISTEN 82477/redis-server
tcp 0 0 192.168.10.20:7003 0.0.0.0:* LISTEN 82482/redis-server
tcp 0 0 192.168.10.20:7004 0.0.0.0:* LISTEN 82487/redis-server
tcp 0 0 192.168.10.20:7005 0.0.0.0:* LISTEN 82492/redis-server
tcp 0 0 192.168.10.20:17000 0.0.0.0:* LISTEN 82467/redis-server
tcp 0 0 192.168.10.20:17001 0.0.0.0:* LISTEN 82472/redis-server

[root@localhost ~]# yum -y install ruby
[root@localhost ~]# gem install redis-3.3.0.gem
Successfully installed redis-3.3.0
Parsing documentation for redis-3.3.0
Installing ri documentation for redis-3.3.0
1 gem installed
[root@localhost ~]# ln -s /usr/local/redis/src/redis-trib.rb /usr/bin/
[root@localhost ~]# redis-trib.rb create --replicas 1 192.168.10.20:7000 192.168.10.20:7001 192.168.10.20:7002 192.168.10.20:7003 192.168.10.20:7004 192.168.10.20:7005
…………
M: 37e6e0038f68fd32565cde5cdd1f533ac2c6255e 192.168.10.20:7000
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: 3361632b615353f40116c171c958f9c5d03df25d 192.168.10.20:7002
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: dec4af2591dc170d4dbf329b4ad356b9e69619f9 192.168.10.20:7004
slots: (0 slots) slave
replicates bf5734ff714af1ff5c3fb0cbe32a97c0aa141a87
S: eac7000946dcbe453af7792078625ce301a681a7 192.168.10.20:7005
slots: (0 slots) slave
replicates 3361632b615353f40116c171c958f9c5d03df25d
S: 6c5d878b1184dc89eaf402f026645e42508496a4 192.168.10.20:7003
slots: (0 slots) slave
replicates 37e6e0038f68fd32565cde5cdd1f533ac2c6255e
M: bf5734ff714af1ff5c3fb0cbe32a97c0aa141a87 192.168.10.20:7001
slots:5461-10922 (5462 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@localhost ~]# redis-trib.rb check 192.168.10.20:7000
>>> Performing Cluster Check (using node 192.168.10.20:7000)
M: 37e6e0038f68fd32565cde5cdd1f533ac2c6255e 192.168.10.20:7000
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: 3361632b615353f40116c171c958f9c5d03df25d 192.168.10.20:7002
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: dec4af2591dc170d4dbf329b4ad356b9e69619f9 192.168.10.20:7004
slots: (0 slots) slave
replicates bf5734ff714af1ff5c3fb0cbe32a97c0aa141a87
S: eac7000946dcbe453af7792078625ce301a681a7 192.168.10.20:7005
slots: (0 slots) slave
replicates 3361632b615353f40116c171c958f9c5d03df25d
S: 6c5d878b1184dc89eaf402f026645e42508496a4 192.168.10.20:7003
slots: (0 slots) slave
replicates 37e6e0038f68fd32565cde5cdd1f533ac2c6255e
M: bf5734ff714af1ff5c3fb0cbe32a97c0aa141a87 192.168.10.20:7001
slots:5461-10922 (5462 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@localhost ~]# redis-cli -h 192.168.10.20 -p 7000 -c #以下为测试
192.168.10.20:7000> set hbkjsdvbsdlujihsdjmvik sdgvgsdg;
-> Redirected to slot [9153] located at 192.168.10.20:7001
OK
192.168.10.20:7001> set qq aa
OK
192.168.10.20:7001>


推荐阅读
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细记录了在基于Debian的Deepin 20操作系统上安装MySQL 5.7的具体步骤,包括软件包的选择、依赖项的处理及远程访问权限的配置。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • This guide provides a comprehensive step-by-step approach to successfully installing the MongoDB PHP driver on XAMPP for macOS, ensuring a smooth and efficient setup process. ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
  • 利用存储过程构建年度日历表的详细指南
    本文将介绍如何使用SQL存储过程创建一个完整的年度日历表。通过实例演示,帮助读者掌握存储过程的应用技巧,并提供详细的代码解析和执行步骤。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 在使用SQL Server进行动态SQL查询时,如果遇到LIKE语句无法正确返回预期结果的情况,通常是因为参数传递方式不当。本文将详细探讨这一问题,并提供解决方案及相关的技术背景。 ... [详细]
  • 本文详细介绍了Python编程语言的学习路径,涵盖基础语法、常用组件、开发工具、数据库管理、Web服务开发、大数据分析、人工智能、爬虫开发及办公自动化等多个方向。通过系统化的学习计划,帮助初学者快速掌握Python的核心技能。 ... [详细]
author-avatar
美美2502909961
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有