Redis

1丶NoSQL 数据库

NoSQL:

		no  sql  (不支持sql查询)
		not only sql (不仅仅只有sql)

NoSQL的适用场景:

		1、获取最新的N个数据
		2、获取数据的topN(最新的N个数据)
		3、需要精确设置数据的过期时间
		4、计数器
		5、求取两个集合的交集、并集、差集
		6、构建实时消息系统
		7、缓存数据(热数据)
		8、构建对列

		热数据:经常被使用数据、高频使用的数据就是热数据。

NoSQL不适用场景:

		不支持事务
		基于sql的结构化查询存储,处理复杂的关系,需要即席查询(用户自定义查询条件的查询)

2丶什么是redis

Redis是一个使用C语言编写的 key-value 开源的 NOSQL存储系统,不支持SQL语句.redis数据存储在内存中,支持持久化(将数据写入硬盘)

3丶redis的安装

1、上传并解压
2、准备编译的环境(C语言开发  make  &&  	make  install)
yum -y install gcc-c++
yum -y install tcl
3、进去解压后的目录,执行编译
make && make  install
4、修改配置文件
	添加日志路径和数据存储(内存数据序列化后	的数据)路径
	配置redis.conf
	bind node01
	daemonize yes
	pidfile /var/run/redis_6379.pid
	logfile "/export/servers/redis-	3.2.8/logs/redis.log"
	dir /export/servers/redis-3.2.8/redisdata
5、启动集群并登陆测试
	Cd   /export/servers/redis-3.2.8/src
	./redis-server   ../redis.conf

查看是否启动
	ps -ef | grep redis
	root       7976      1  0 18:42 ?        00:00:00 	./redis-server node01:6379  

登陆redis客户端
	./redis-cli  -h node01
node01:6379> 
node01:6379> 
node01:6379> 
node01:6379>
node01:6379> set name zhangsan
OK
node01:6379> keys  *
1) "name"
node01:6379> get name
"zhangsan"
node01:6379>

redis字符串操作

添加字符串	        	 set  hello world
设置多个KV        		mset AA AAA BB BBB CC CCC
设置过期时间			setex hello1  5 word1
查询字符串			get  hello
查询多key			mget hello hello2 hello3
查询长度			strlen  hello
修改字符串			set  hello  world2
删除字符串			del  hello

Hash

添加一个hash列表		hset hkey1 name zhangsan
一次设置多个值		hmset hkey3 name wangwu age 20 sex 1
查看数据		hget hkey1 name
查询key内所有的字段		hkeys hkey3
查询key的数据量		hlen hkey3
查询某一key内多字段的值		hmget  hkey3 name age
修改数据		hset hkey1 name zhangsan2
删除key中的数据		hdel hkey3 sex

List必须掌握

添加一个或多个值到列表		lpush lkey1 zhangsan lisi
向已经存在的列表中插入数据(右边插入)		rpush lkey1 AA  BB
查询list中所有数据 	(-1表示所有)	lrange lkey1 0 -1
通过索引查询数据		lindex lkey1 0
通过索引修改数据		lset lkey1 5 eee
删除指定key数据		del lkey1
移出并获取列表的第一个元素		lpop lkey1
移出并获取列表的最后一个元素		rpop lkey1
移除列表的最后一个元素,并将该元素添加到另一个列表并返回		rpoplpush lkey1 lkey2

Set 必须掌握

向集合添加一个或多个数据		sadd skey1  zhangsan  lisi 
查询集合所有数据		smembers skey1
查询两个集合的差值		sdiff skey1 skey2
查询两个集合交集		sinter skey1 skey2
查询并集		sunion skey1  skey2
将数据在一个集合移动到另一个集合		smove skey1 skey2 zhangsan
移除结果中的某个数据		srem skey2 zhangsan

对Key的常用操作

查询所有符合模式的key		Keys *
查询key对应数据的类型		Type hkey1  
查询剩余过期时间(秒)		ttl  hkey1
对key进行重命名		Rename  hkey1  hkey10
删除存在的key		del BB

Redis数据的持久化

	redis持久化指将redis内存中的数据写入磁盘,进行有永久性存储,防止数据丢失。

方式1、RDB:

	自动触发方式:在redis.conf配置文件中添加“  save  N  M”,N表示触发的时间,M表示对redis进行操作的次数,当两个同时达到以后,才会触发数据持久化。 
	
	人为触发方式:  save     bgsave
		Save:在进行对数据进行持久化时,会将数据的读写请求阻塞,这是读写操作无法完成
		Bgsave: 在进行对数据进行持久化时,不会将数据的读写请求阻塞,这是读写操作正常执行
	配置RDB自动持久化流程

1、配置redis.conf配置文件,添加 save N M
2、重启redis服务,添加新数据至少M条,N秒过后,重启redis服务
3、重启后查看上次关机时的数据是否存在

优点:对性能的影响小,是可到的备份数据的手段。
缺点:确定可能造成部分数据丢失,N M 不好配置。

方式2、AOF

appendfsync no: 表示由OS决定何时触发数据存储。数据存储速度最快,但丢失数据风险较高。
appendfsync always:表示每条数据都进行一次存储,数据丢失的风险最低,但存储的速度比较慢。
appendfsync everysec:表示每秒存储一次。

配置:修改redis.conf配置文件,将appendonly  no改成appendonly  yes。
	启动redis 设置新数据,重启redis查看数据是否存在,若在表示成功,反之不成功。

缺点:AOF比RDB数据文件大,性能消耗及RDB高,恢复数据的速度慢。

IT行业数据读取写入性能优化 终极解决方案(人生精华)

读写分离

1、基于一台服务器内的多个磁盘,1、2、3磁盘只负责数据的写入,4、5、6只负责数据读取
多个服务器,1、2、3服务器只负责数据写入,4、5、6只负责数据的读取。

在这里插入图片描述

安装部署主从复制机制

1、在node02  03节点安装redis
a)上传并解压
b)准备编译环境
yum -y install gcc-c++
yum -y install tcl
c)重新编译
make  && make  install
d)修改配置
node02与node03服务器修改redis配置文件
node02服务器修改配置文件命令如下
执行以下命令修改redis配置文件
cd /export/servers/redis-3.2.8/
mkdir -p /export/servers/redis-3.2.8/logs
mkdir -p /export/servers/redis-3.2.8/redisdata
vim redis.conf
bind node02
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "/export/servers/redis-3.2.8/logs/redis.log"
dir /export/servers/redis-3.2.8/redisdata
slaveof node01 6379
node03服务器修改配置文件命令如下
执行以下命令修改redis配置文件
cd /export/servers/redis-3.2.8/
mkdir -p /export/servers/redis-3.2.8/logs
mkdir -p /export/servers/redis-3.2.8/redisdata
vim redis.conf
bind node03
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "/export/servers/redis-3.2.8/logs/redis.log"
dir /export/servers/redis-3.2.8/redisdata
slaveof node01 6379

第二步、启动node02与node03机器的redis服务

node02执行以下命令启动redis服务
cd  /export/servers/redis-3.2.8/src
redis-server  ../redis.conf
node03执行以下命令启动redis服务
cd  /export/servers/redis-3.2.8/src
redis-server  ../redis.conf

启动成功便可以实现redis的主从复制,node01可以读写操作,node02与node03只支持读取操作。

主从复制机制存在的问题?若主节点宕机,数据间将无法写入redis. 解决办法???

方案一:HA(高可用),配置两个masters
方案二:目标:将从节点改成主节点。实现方式-哨兵机制
	
	哨兵机制:前提,主从复制机制完好,并开启。

哨兵:redis当中的Sentinel架构

Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。

第一步:三台机器修改哨兵配置文件
三台机器执行以下命令修改redis的哨兵配置文件

cd /export/servers/redis-3.2.8
vim sentinel.conf
#配置监听的主服务器,这里sentinel monitor代表监控,mymaster代表服务器的名称,可以自定义,192.168.11.128代表监控的主服务		器,6379代表端口,2代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作。
#修改bind配置,每台机器修改为自己对应的主机名
bind node01  
#配置sentinel服务后台运行
daemonize yes
#修改三台机器监控的主节点,现在主节点是node01服务器
sentinel monitor mymaster node01 6379 2
#sentinel author-pass定义服务的密码,mymaster是服务名称,123456是Redis服务器密码
#sentinel auth-pass < master-name> < password>

第二步:三台机器启动哨兵服务

三台机器执行以下命令启动哨兵服务
cd /export/servers/redis-3.2.8
src/redis-sentinel sentinel.conf 


注意:此时redis-server和sentinel两个都要启动

第三步:node01服务器杀死redis服务进程

使用kill  -9命令杀死redis服务进程,模拟redis故障宕机情况
过一段时间之后,就会在node02与node03服务器选择一台服务器来切换为主节点

第四步:redis的sentinel模式代码开发连接

/**
 * 测试Redis哨兵模式
 * @author liu
 */
    @Test
public void testSentinel() {
    JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
    jedisPoolConfig.setMaxTotal(10);
    jedisPoolConfig.setMaxIdle(5);
    jedisPoolConfig.setMinIdle(5);
    // 哨兵信息
    Set<String> sentinels = new HashSet<>(Arrays.asList("node01:26379",
            "node02:26379","node03:26379"));
    // 创建连接池
    JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels,jedisPoolConfig);
    // 获取客户端
    Jedis jedis = pool.getResource();
    // 执行两个命令
    jedis.set("mykey", "myvalue");
    String value = jedis.get("mykey");
    System.out.println(value);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值