redis的使用和安装,redis基础和高级部分

在后端开发中,为了提高性能,对于一些经常查询但是又不太变化的内容会使用redis,比如前端的列表展示项等,如果数据有变化也可以清空缓存,让前端查一次数据库,所以使用redis相对高效和灵活.本文主要对于redis在linux上的使用和安装进行说明。

1.redis的安装
2.redis常用的命令
3.在阿里云上面安装redis
4.在vwmare上安装redis
5.利用jedis连接redis进行存入和输出
6.redis的高可用,哨兵机制,主从复制(安装三台redis服务器,一台主redis)
7.redis常见错误
8.redis持久化(AOF与RDB区别)

1.首先通过shell连接到阿里云服务器。

image.png

2.输入 yum -y install gcc 进行安装redis

3.输入命令: wget http://download.redis.io/releases/redis-3.2.9.tar.gz

image.png

4.输入命令:

tar xzf redis-3.2.9.tar.gz
cd redis-3.2.9
make MALLOC=libc

image.png

5.启动Redis服务
在redis安装目录下的redis.conf文件中的如下内容:默认安装路径是在/root/redis-3.2.9 下面

1、注释掉redis安装目录下的redis.conf文件中的如下数据:bind 127.0.0.1,修改后为#bind 127.0.0.1
2、修改保护模式为非:默认为protected-mode yes ,修改后为protected-mode no
3、设置redis连接密码:找到#requirepass foobared ,在下面添加requirepass 123456
然后启动redis server:输入指令src/redis-server redis.conf

image.png

还需要把阿里云上的redis的6379的端口打开

image.png
常用指令
在以上过程中可能会需要重启redis server,终止和重启的命令如下:
1、终止,通过杀死redis的进程
kill -9 进程ID (解释:-9的含义是强制杀死)
进程ID可以通过如下命令查询:
ps -ef | grep 'redis'
ps aux | grep '6379' --- 查询端口
kill -15 9886 --- 杀死重置
kill -9 9886 --- 强制杀死

在服务器开启后可以开启客户端进行测试

启动客户端并测试
src/redis-cli
带密码的启动方式
./redis-cli -h 127.0.0.1 -p 6379 -a 123456
-h 是主机IP地址
-p 是端口号
-a 是密码
也可以直接通过代码进行测试

6.通过jedis连接redis,通过java代码实现存储redis,并从redis当中取值

需要在marven当中加入
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>

然后直接写个测试类测试一下

image.png

测试代码

package com.winter.utils.redis;

import org.junit.Test;
import redis.clients.jedis.Jedis; import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map; public class TestRedis {
private Jedis jedis;
//
@Before
public void setup() {
jedis = new Jedis("192.168.184.128", 6379);//连接服务器
jedis.auth("123456");//密码
// }
@Test
public void test哨兵机制(){
Jedis jedis = new Jedis("192.168.184.128", 6379);
// //权限认证,密码设置的是123456
jedis.auth("123456");
jedis.set("name","我是192.168.184.128存在主服务器");
Jedis jedis1 = new Jedis("192.168.184.136", 6379);
// //权限认证,密码设置的是123456
jedis1.auth("123456");
String name1 = jedis1.get("name");
System.out.println("我是136从机"+name1);
Jedis jedis2 = new Jedis("192.168.184.135", 6379);
// //权限认证,密码设置的是123456
jedis2.auth("123456");
String name2 = jedis2.get("name");
System.out.println("我是135从机"+name2);
System.out.println("测试从机是否可写");
try {
jedis1.set("name2","测试从机是否可写");
jedis2.set("name2","测试从机是否可写");
System.out.println("测试不成功,135从机可以写");
}catch (Exception e){
System.out.println("说明从机没有写的权限");
System.out.println("输出结果"+e.getMessage());
} } /**
* redis存储字符串
*/
@Test
public void testString() {
jedis.set("name", "xinxin");//向key-->name中放入了value-->xinxin
System.out.println(jedis.get("name"));//执行结果:xinxin jedis.append("name", " is my lover"); //拼接
System.out.println(jedis.get("name")); jedis.del("name"); //删除某个键
System.out.println(jedis.get("name"));
//设置多个键值对
jedis.mset("name", "liuling", "age", "23", "qq", "476777XXX");
jedis.incr("age"); //进行加1操作
System.out.println(jedis.get("name") + "-" + jedis.get("age") + "-" + jedis.get("qq")); } /**
* redis操作Map
*/
@Test
public void testMap() {
//-----添加数据----------
Map<String, String> map = new HashMap<String, String>();
map.put("name", "xinxin");
map.put("age", "22");
map.put("qq", "123456");
jedis.hmset("user", map);
//取出user中的name,执行结果:[minxr]-->注意结果是一个泛型的List
//第一个参数是存入redis中map对象的key,后面跟的是放入map中的对象的key,后面的key可以跟多个,是可变参数
List<String> rsmap = jedis.hmget("user", "name", "age", "qq");
System.out.println(rsmap); //删除map中的某个键值
jedis.hdel("user", "age");
System.out.println(jedis.hmget("user", "age")); //因为删除了,所以返回的是null
System.out.println(jedis.hlen("user")); //返回key为user的键中存放的值的个数2
System.out.println(jedis.exists("user"));//是否存在key为user的记录 返回true
System.out.println(jedis.hkeys("user"));//返回map对象中的所有key
System.out.println(jedis.hvals("user"));//返回map对象中的所有value Iterator<String> iter = jedis.hkeys("user").iterator();
while (iter.hasNext()) {
String key = iter.next();
System.out.println(key + ":" + jedis.hmget("user", key));
}
} /**
* jedis操作List
*/
@Test
public void testList() {
//开始前,先移除所有的内容
jedis.del("java framework");
System.out.println(jedis.lrange("java framework", 0, -1));
//先向key java framework中存放三条数据
jedis.lpush("java framework", "spring");
jedis.lpush("java framework", "struts");
jedis.lpush("java framework", "hibernate");
//再取出所有数据jedis.lrange是按范围取出,
// 第一个是key,第二个是起始位置,第三个是结束位置,jedis.llen获取长度 -1表示取得所有
System.out.println(jedis.lrange("java framework", 0, -1)); jedis.del("java framework");
jedis.rpush("java framework", "spring");
jedis.rpush("java framework", "struts");
jedis.rpush("java framework", "hibernate");
System.out.println(jedis.lrange("java framework", 0, -1));
} /**
* jedis操作Set
*/
@Test
public void testSet() {
//添加
jedis.sadd("user", "liuling");
jedis.sadd("user", "xinxin");
jedis.sadd("user", "ling");
jedis.sadd("user", "zhangxinxin");
jedis.sadd("user", "who");
//移除noname
jedis.srem("user", "who");
System.out.println(jedis.smembers("user"));//获取所有加入的value
System.out.println(jedis.sismember("user", "who"));//判断 who 是否是user集合的元素
System.out.println(jedis.srandmember("user"));
System.out.println(jedis.scard("user"));//返回集合的元素个数
} @Test
public void test() throws InterruptedException {
//jedis 排序
//注意,此处的rpush和lpush是List的操作。是一个双向链表(但从表现来看的)
jedis.del("a");//先清除数据,再加入数据进行测试
jedis.rpush("a", "1");
jedis.lpush("a", "6");
jedis.lpush("a", "3");
jedis.lpush("a", "9");
System.out.println(jedis.lrange("a", 0, -1));// [9, 3, 6, 1]
System.out.println(jedis.sort("a")); //[1, 3, 6, 9] //输入排序后结果
System.out.println(jedis.lrange("a", 0, -1));
} // @Test
// public void testRedisPool() {
// RedisUtil.getJedis().set("newname", "中文测试");
// System.out.println(RedisUtil.getJedis().get("newname"));
// }
}

application.yml

server:
port: 8081 spring:
datasource:
name: test
url: jdbc:mysql://127.0.0.1:3306/mytest?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
username: root
password: root
# 使用druid数据源
# type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
filters: stat
maxActive: 20
initialSize: 1
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 20
redis:
database: 0
host: 101.132.191.77
port: 6379
password: 123456
pool:
max-idle: 8
min-idle: 0
max-active: 8
max-wait: -1
timeout: 5000
mybatis:
mapper-locations: classpath:mapping/*.xml
type-aliases-package: com.winter.model #pagehelper
pagehelper:
helperDialect: mysql
reasonable: true
supportMethodsArguments: true
params: count=countSql
########################################################
###Redis (RedisConfiguration)
######################################################## ###spring.redis.database=0
###spring.redis.host=127.0.0.1
###spring.redis.port=6379
###spring.redis.password=123456
###spring.redis.pool.max-idle=8
###spring.redis.pool.min-idle=0
###spring.redis.pool.max-active=8
###spring.redis.pool.max-wait=-1
###spring.redis.timeout=5000

demo地址

redis的主从复制是什么?
redis的主从复制主要还是读写分离,一台主redis有读和写的权限,其他从机redis只有读的权限,这样做的好处是为了减轻redis主机的压力。
redis的哨兵机制?
例:有3台redis,一台是主redis,2台是从机,开启哨兵机制后,3台redis开启后会发送心跳包到哨兵这里。如果主机挂了,那么哨兵会从另外2台从机这里选出一台作为主机(从原来只有读权限升级为读写权限)
那如果3台都挂了怎么办呢,一般企业会有备用机,或者利用keepalive的监听重启服务器。
哨兵的功能+keepalive重启服务器功能=redis的高可用

image.png

为了进行redis的集群操作,需要安装vwmare,然后安装linux 64位系统进行测试。
这个安装就不详说了。安装vwmare以后下载linux 64位镜像,然后导入镜像即可。说下我遇到的坑以及看到的有帮助网址。

Could not connect to '10.7.100.182' (port 22): Connection failed
Xshell远程连接Linux服务器出错——Could not connect to '114.214.166.5' (port 22): Connection failed.

主要问题可能为两个:(1)sshd服务器没有启动;(2)防火墙问题 并且需要永久开启sshd和关闭防火墙

步骤一:启动sshd服务器
1,sshd服务安装
2,[root@localhost /]# vi /etc/ssh/sshd_config
Port 22
Protocol 2
PermitRootLogin yes
去掉这三行的注释
最后一个重要!因为它是允许root用户直接使用sshd服务登录服务器的!
3,重新启动sshd服务
[root@localhost /]# service sshd restart
4,设置sshd为系统自动启动

chkconfig iptables off 永久性生效
chkconfig ip6tables off 防火墙还需要关闭ipv6的防火墙:

步骤二:关闭防火墙
chkconfig iptables off 永久性生效

image.png

虚拟机安装以后可以进行克隆(需要先把服务器给关掉后才可以克隆)

image.png

image.png

原理就是主redis开启以后保存内存快照发送到从服务器,因此从服务器里面就会有主服务器的数据

image.png

7.如何设置主redis和从redis?

修改从服务器redis中的 redis.conf文件
slaveof 192.168.33.130 6379 这个是主服务器的地址和端口,就是把从的和主的进行关联
masterauth 123456--- 主redis服务器配置了密码,则需要配置
通过redis-cli连接后输入info命令查看role:master,role:slave可以查看主服务器和从服务器

到redis目录下修改sentinel.conf(这个是哨兵的配置文件)

1.修改sentinel monitor mymaster 192.168.184.128 6379 1   这里的128是主redis,6379是端口号,1是投票,哨兵根据投票数选取一个从redis作为主服务器,一般都是设置为1. 不需要在主redis当中配置哨兵
2.sentinel down-after-milliseconds mymaster 5000 心跳检测,5秒钟没访问到就换服务器
3.sentinel parallel-syncs mymaster 2 最多有2个子节点,就是备份服务器
4.启动的时候src/redis-server redis.conf
然后开启客户端sentinel.conf --sentinel & 要将redis,redis配置文件还有哨兵都开开来

image.png

8.redis事务

redis也有事务,就是主redis要提交以后,才能从从机上查到redis,redis事务平时用的极少

9.Redis持久化

什么是Redis持久化
什么是Redis持久化,就是将内存数据保存到硬盘。
Redis 持久化存储 (AOF 与 RDB 两种模式)
RDB 默认开启,redis.conf 中的具体配置参数如下;主要是修改save这里

#dbfilename:持久化数据存储在本地的文件
dbfilename dump.rdb
#dir:持久化数据存储在本地的路径,如果是在/redis/redis-3.0.6/src下启动的redis-cli,则数据会存储在当前src目录下
dir ./
##snapshot触发的时机,save
##如下为900秒后,至少有一个变更操作,才会snapshot
##对于此值的设置,需要谨慎,评估系统的变更操作密集程度
##可以通过“save “””来关闭snapshot功能
#save时间,以下分别表示更改了1个key时间隔900s进行持久化存储;更改了10个key300s进行存储;更改10000个key60s进行存储。
save 900 1
save 300 10
save 60 10000
##当snapshot时出现错误无法继续时,是否阻塞客户端“变更操作”,“错误”可能因为磁盘已满/磁盘故障/OS级别异常等
stop-writes-on-bgsave-error yes
##是否启用rdb文件压缩,默认为“yes”,压缩往往意味着“额外的cpu消耗”,同时也意味这较小的文件尺寸以及较短的网络传输时间
rdbcompression yes

AOF持久化

AOF 默认关闭,开启方法,修改配置文件 reds.conf:appendonly yes

##此选项为aof功能的开关,默认为“no”,可以通过“yes”来开启aof功能
##只有在“yes”下,aof重写/文件同步等特性才会生效
appendonly yes
##指定aof文件名称
appendfilename appendonly.aof
##指定aof操作中文件同步策略,有三个合法值:always everysec no,默认为everysec
appendfsync everysec
##在aof-rewrite期间,appendfsync是否暂缓文件同步,"no"表示“不暂缓”,“yes”表示“暂缓”,默认为“no”
no-appendfsync-on-rewrite no
##aof文件rewrite触发的最小文件尺寸(mb,gb),只有大于此aof文件大于此尺寸是才会触发rewrite,默认“64mb”,建议“512mb”
auto-aof-rewrite-min-size 64mb
##相对于“上一次”rewrite,本次rewrite触发时aof文件应该增长的百分比。
##每一次rewrite之后,redis都会记录下此时“新aof”文件的大小(例如A),那么当aof文件增长到A*(1 + p)之后
##触发下一次rewrite,每一次aof记录的添加,都会检测当前aof文件的尺寸。
auto-aof-rewrite-percentage 100

AOF与RDB区别
RDB是要输入一定次数时间才会存储,速度快,但是可能会有漏的,不安全,AOF属于String的append,每次存储都会存在本地,不会漏,但是效率慢,安全

10.redis订阅频道

redis订阅频道的原理与我之前做的极光推送比较类似,原理就是前端有个频道号和后端的频道后一一匹配,然后后端把消息发送给极光服务器,告诉极光要发送消息给哪些有订阅的手机。像极光的话还会把后端传给他的消息推送到苹果推送服务器上,再由苹果服务器将消息推送给用户。

image.png

redis的使用和安装,redis基础和高级部分的更多相关文章

  1. 安装window下的redis,redis可视化管理工具(Redis Desktop Manager)安装,基础使用,实例化项目

    以下包括内容: 一.redis下载安装,启动 二.Redis可视化管理工具(Redis Desktop Manager)安装 三.实例化项目 一.redis下载安装,启动 1,redis官方下载地址: ...

  2. C#中使用Redis学习一 windows安装redis服务器端和客户端

    学习背景 今天是2015年1月2日,新年刚开始的第二天,先祝大家元旦快乐啦(迟到的祝福吧^_^).前段时间一直写Jquery插件开发系列博文,这个系列文章暂停一段时间,最近一直在看redis,我将把r ...

  3. Linux安装配置Redis,CentOS7下安装Redis教程

    1.下载Redis wget https://download.redis.io/releases/redis-3.0.4.tar.gz 2 . 解压Redis .tar.gz 3 . 编译安装Red ...

  4. Linux安装配置Redis CentOS 7 下安装Redis

    Redis是一个高性能的,开源key-value型数据库.是构建高性能,可扩展的Web应用的完美解决方案,可以内存存储亦可持久化存储.因为要使用跨进程,跨服务级别的数据缓存,在对比多个方案后,决定使用 ...

  5. 【docker】【redis】1.docker安装redis【单点redis服务】

    1.首先确定 需要在docker上拉取redis的哪个版本的镜像 [由于使用了aliyun的源,并且加速器也是用的阿里云的加速器,所以直接在阿里云开发者平台上找redis的镜像有哪些版本是再好不过了, ...

  6. Linux安装PHP的Redis扩展(已安装Redis)

    1.下载需要的php操作redis的扩展包 下载地址 http://pecl.php.net/package/redis    下载对应php版本,我的php版本为7.3,下载的是最新的版本5.0.2 ...

  7. 如何在Windows系统上面安装redis

    一.Redis简介 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(s ...

  8. Redis在windows下安装过程

    一.下载windows版本的Redis 去官网找了很久,发现原来在官网上可以下载的windows版本的,现在官网以及没有下载地址,只能在github上下载,官网只提供linux版本的下载 官网下载地址 ...

  9. Linux(Centos)之安装Redis及注意事项

    1.redis简单说明 a.在前面我简单的说过redis封装成共用类的实现,地址如下:http://www.cnblogs.com/hanyinglong/p/Redis.html. b.redis是 ...

随机推荐

  1. ant design pro (四)新增页面

    一.概述 参看地址:https://pro.ant.design/docs/new-page-cn 这里的『页面』指配置了路由,能够通过链接直接访问的模块,要新建一个页面,通常只需要在脚手架的基础上进 ...

  2. percona XTRADB Cluster 5.6在ubuntu安装

    installing-perconaXTRADB Cluster 5.6 in-ubuntu-13-10-wheezy First of all, I would recommend login as ...

  3. qq 自制表情包

      如何自制qq表情包? CreateTime--2018年2月5日15:34:35 Author:Marydon 1.添加表情 2.选择表情(可以进行多选) 3.对添加的表情进行分组 4.添加成功( ...

  4. 双系统 ubuntu装完系统后 丢失原win系统启动项

    sudo update-grub 可以尝试以上命令 注意这里是先装的win 后装的ubuntu

  5. Linux-软件包管理-yum在线安装rz、sz工具

    yum search lrzsz yum方式查询 rpm -q lrzsz rpm方式查询 yum -y install lrzsz 安装 rpm -q lrzsz rpm方式查询 sz下载 rz上传

  6. LIntcode---将二叉搜索树转成较大的树

    Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original B ...

  7. resharper警告 :linq replace with single call to FirstOrDefault

    使用resharper时对linq使用的FirstOrDefault 一直产生一个警告,

  8. Memory leak patterns in JavaScript

    Handling circular references in JavaScript applications Plugging memory leaks in JavaScript is easy ...

  9. firefox因 HTTP 严格传输安全(HSTS)机制无法打开网页

    1.打开about:config 2.查找: security.enterprise_roots.enabled ,默认为false,改为true就可以了 3.吐槽,firefox太极端了,这是作死.

  10. 对象.delegate=self的理解

    整理自:http://www.cocoachina.com/ask/questions/show/87430 各位大神,对象.delegate=self是啥意思,委托的意思不就是自己的任务交给其他人去 ...