一、Redis基础

1、简介

remote dictionary server  远程字典服务

C语言编写,基于内存,可持久化的日志型key value数据库。

他会周期性将更新的数据写入磁盘或把修改操作追加到记录文件,且在此基础上实现了主从同步。

2、redis能干嘛

  1. 内存存储,持久化,内存中是断电及失,所以持久化很重要(rdb/aof)

  2. 效率高,用于高速缓存

  3. 发布订阅系统

  4. 地图信息分析

3、redis特性

  1. 持久化

  2. 多样数据类型

  3. 集群

  4. 事务

4、linux安装

1、下载压缩包

wget url

2、复制压缩包到opt目录下

mv reids-6.0.7.tar.gz /opt

3、切换到/opt下并解压redis

cd /opttar -zxvf reids-6.0.7.tar.gz

4、c环境安装

yum install gcc-c++#查看本版,版本过低后续安装会报错gcc -v 

5、安装redis

cd /opt/reids-6.0.7#gcc版本过低make会失败make#确认是否安装成功make install

6、拷贝redis.conf文件到redis安装路径下

# /usr/local/bin为redis默认安装路径,make成功后该路径下会有reids的客户端cd /usr/local/bin#创建目录存放conf文件mkdir rconfig#复制conf文件到rconfig目录cp /opt/redis-6.0.7/redis.conf rconfig

7、修改conf文件

vim rconf/redis.conf#deamonize no 改为 yes#bind 127.0.0.1 改为 0.0.0.0

8、启动redis

cd /usr/local/bin#开启redis服务reids-server rconfig/redis.conf

9、连接测试

#连接redis 默认端口6379 也可以省略redis-cli -p 6379127.0.0.1:6379> ping #连接测试PONG #连接成功127.0.0.1:6379> set key value  127.0.0.1:6379> get key  #获取指定key的值127.0.0.1:6379> keys *   #获取所有的key127.0.0.1:6379> shutdown #关闭redis....> exit               #退出连接

查看redis进程是否开启

ps -ef| grep redis

5、Redis基本知识

开启redis--------

#/usr/local/bin下 rconfig为自定义的文件夹存放redis.confredis-server rconfig/redis.conf

连接redis

#本机可省略-h; port为6379也可省略-predis-cli -h ip -p port

redis默认有16个数据库,默认使用第一个数据库

# 切换数据库 index从0-15127.0.0.1:6379> select index#当前数据库使用大小127.0.0.1:6379> dbsize#清空当前数据库127.0.0.1:6379> flushdb#清空所有数据库127.0.0.1:6379> flushall

redis端口为什么是6379

merz(女明星)九宫格对应数字

redis是单线程的,redis是纯内存数据库,一般都是简单的存取操作

为什么redis单线程还这么快

多线程会产生cpu上下文切换,消耗资源;

redis全程使用hash结构,读取速度快;

基本命令

命令 解释
EXISTS key [key ...] key是否存在
expire key seconds 设置过期时间
ttl key 查看key过期剩余时间
move key db 迁移key
del key 移除key
type key 查看当前key类型

6、redis常见数据类型

基本数据类型:

string、list、set、hash、zset(sorted set)

特殊数据类型

Geospatial地理位置、hyperloglog计数统计算法、bitmaps位存储

6.1 String(字符串)

操作 命令
字符串追加 append  key  value
获取长度 strlen key
key加一(递增)(计数器) incr key
key减一(递减) decr key
设置key增长量 incrby key increment
设置key减少量 decrby key decremen
获取字符串指定范围内容 getrange key start end
获取全部 getrange key 0 -1
字符串内容替换(指定位置开始替换) setrange key offset value
将值 value 关联到 key ,并设置过期时间 setex key  seconds value
key不存在再设置(分布式锁常用) setnx key value
批量set mset key value [key value ...]
批量get mget key [key ...]
同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在(原子性) msetnx key value [key value ...]
将给定 key 的值设为 value ,并返回 key 的旧值 getset key value

string存对象

#1、设置user:1对象,值为Json保存set user:1 {name:xls,age=23}#2、属性存入key,方便获取,不用解析json(与hash类似)mset user:1:name xls user:1:age 23

6.2 list(列表)

Redis中list可以当成栈、队列、阻塞队列

所有的list命令都是以L开头

常用命令:

lpush key  element [element ...] 向list中存值(列表头部插入)
lrange key start stop 获取list数据(0 -1全部)
Rpush key element [element ...] 向列表尾部插值
Lpop key 左移除(移除列表第一个元素)
Rpop key 右移除(移除列表最后一个元素)
Lindex key index 通过下标获取值
Llen key 返回列表长度
Lrem key count value 移除指定个数的value
Ltrim key start stop 截取列表
Rpoplpush source destination 移除列表最后一个元素,并放入新的列表
Lset key index element 向列表中指定下标替换(列表必须存在,下标必须存在)
Linsert key before/after pirot value 向列表指定值前/后插入新的值

list实际是个链表,left、right都可插入

消息队列:走进右拿 lpush Rpop

栈:左进左拿 lpush lpop

6.3 set(无序集合)

Sadd key value 插入
Smembers key 查看指定set的所有值
Sismember key value set中是否包含元素
Scard key set的元素个数
Srem key value [value ...] 移除set中元素
Srandmember key [count] 随机选出指定个数元素
Spop key 随机移除set中一个元素
Smove soure destination member 将目标set中元素移除到指定set
Sdiff key [key ...] 差集
Sinter key [key ...] 交集
Sunion key [key ...] 并集

6.4 hash(哈希)

key-map,hash的值是一个map集合key-value

应用:用户信息保存;经常变更的数据;对象的存储。

Hset key field value [field value ...] 插入
Hget key field [field ...] 获取元素
Hgetall key 获取hash所有元素
Hdel key field [field ...] 删除元素
Hlen key hash长度
Hexists key field 元素是否存在
Hkeys key/Hvals key 获取所有字段/获取所有值
Hincrby key field 元素递增
Hdecrby key field 元素递减
Hsetnx key field value 不存在再设置

6.5 Zset(有序集合)

在set基础上加上了一个数的标识用来排序

Zadd key [nx/xx] [ch] [incr] score member [source member]

例:Zadd test 1 one 2 two 3 three

应用:

set排序,储存班级成绩 ,工资表排序

消息权重

排行榜应用实现

Zrange key 0 -1 查看所有
Zrangebysore key min max [witnscore] [limite offset count] 按score排序(小到大)
Zrem key member [member ...] 删除元素
Zcard key 集合元素个数
Zrevrange key 0 -1 大到小排序
Zcount key min max 获取指定区间的数量

6.6 Geospatial(地理位置)

朋友定位,附近的人,打车距离计算

geo基于Zset,Zset的所有命令都可用于geo

两级无法添加,一般通过程序导入,经度-180到180度,纬度-85.05..到85.05..

geoadd key longitude latitude member [longitude latitude member ...] 添加元素及位置
geopos key member 获取指定元素的经纬度
geodist key  member1 member2 两元素间距离
georadius key longitude latitude radius m/km/ft/mi [count number] 以指定位置为中心获取半径内的元素
georadiusbymember key member radius m/km/ft/mi 以指定元素为中心获取半径内的元素

6.7 hyperloglog (基数统计算法)

基数:不重复的数

应用:

统计网站访问人数(一个人多次访问只计一次);

传统的方法:set保存用户id,统计set中元素个数,这个方法需要保存大量用户id,比较麻烦,消耗内存

hyperloglog 占用内存是固定的,2^64不同元素的计数只需12kb内存,0.81%错误率。

pfadd key member [member ...] 添加元素
pfcount key 统计元素中基数数量
pfmerge deskey sourcekey [sourcekey ...] 合并表

6.8 bitmaps(位存储)

两个状态的都可以使用bitmaps;

通过操作二进制来记录,就只会有0/1两种状态,如打卡记录,统计用户信息,活跃不活跃

setbit key offset value 添加(如:setbit sign 1(号数等)   0(0未打卡,1已打卡) )
getbit key offset 查看
bitcount key [start end] 统计

7、Redis基本事务操作

redis单条命令是保证原子性的,但是事务不保证原子性。

redis事务本质:一组命令的集合,一个事务中所有的命令都会被序列化,在事务执行过程中会按照顺序执行。

redis事务中没有隔离级别的概念,只有发起执行命令时才执行(exec)。

7.1 redis事务三个阶段:

  • 开启事务(multi)

  • 命令入队

  • 执行命令(exec)

...> multi  #开启事务ok...> set t1 test1  #入队QUEUED...> set t2 test2  #入队QUEUED...> get t1  #入队  QUEUED...> get t2  #入队QUEUED...> exec    #执行ok           #返回结果ok..

7.2 事务失败

  • 放弃事务(discard):执行该命令后, 队列中的事务将不会被执行。

  • 编译型异常(代码有问题,命令有错):事务中所有的命令都不会被执行。

  • 运行时异常(如1/0):执行时其他命令可以正常执行,错误的命令抛出异常。

7.3 Redis实现乐观锁

watch监视:

事务操作前对元素进行监控,元素被其他线程修改则事务不会执行,每个事务完成watch失效。

...> set money 100...> set out 0...> watch money        #监视money的值...> multi              #开启事务...> decryby money 10...> incryby out 10     ...> exec               #exec之前其他线程修改了money,事务会执行失败,返回nil

unwatch解锁:

如果事务执行失败,则解锁,再watch key 获取新的值,再次监视。

二、Redis使用

1、 通过Jedis操作Redis

Jedis是官方推荐的java连接开发工具,使用Java操作redis中间件(jar包)。

Jedis中所有的api对应的命令用法一致

使用:

<dependency>    <groupId>redis.clientsgroupId>    <artifactId>jedisartifactId>    <version>3.2.0version>dependency>     Jedis jedis=new Jedis("host",ip);System.err.println(jedis.ping());JSONObject json=new JSONObject();json.put("name","xls");json.put("age",23);String result=json.toJSONString();//实现事务Transaction multi = jedis.multi();try {    multi.set("user1",result);    multi.set("user2",result);    multi.exec();} catch (Exception e) {    multi.discard();    e.printStackTrace();} finally {    //关闭连接    jedis.close();}

2 、springboot整合Redis

spring boot的数据相关操作都封装再在spring-Data中,spring-Data也是和Spring Boot齐名的项目。

在Spring Boot 2.x之后,原来使用的Jedis被替换成Lettuce

Jedis:采用直接、多线程操作的话不安全,如果要避免不安全,就要使用Jedis pool连接池。(更像BIO)

Lettuce:采用netty,实例可以在多个线程中共享,不存在线程不安全,可以减少线程数量。(更像NIO)

2.1 自动配置类RedisAutoConfiguration:

RedisAutoConfiguration是Spring Data提供的redis自动配置类。

RedisConnectionFactory实现类有JedisConnectionFactory和LettuceConnectionFactory,

JedisConnectionFactory中引用的类没有导入,所以使用不了jedis连接池,而LettuceConnectionFactory能够使用。

@Configuration(proxyBeanMethods = false)@ConditionalOnClass(RedisOperations.class)@EnableConfigurationProperties(RedisProperties.class)@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })public class RedisAutoConfiguration {    @Bean    @ConditionalOnMissingBean(name = "redisTemplate")//如果没有设置redisTemplate才生效,我们可以自定义一个redisTemplate    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)            throws UnknownHostException {        //默认的RedisTemplate没有过多的设置,redis对象都是需要序列化的        //两个泛型都是Object类型,我们后续使用需要强制转换        RedisTemplate<Object, Object> template = new RedisTemplate<>();        template.setConnectionFactory(redisConnectionFactory);        return template;}    @Bean    @ConditionalOnMissingBean //由于string类型是redis中最长使用的类型,所以单独提出来一个bean    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory)            throws UnknownHostException {        StringRedisTemplate template = new StringRedisTemplate();        template.setConnectionFactory(redisConnectionFactory);        return template;}}

2.1 Spring中使用Redis

2.1、导入依赖

<dependency>    <groupId>org.springframework.bootgroupId>    <artifactId>spring-boot-starter-data-redisartifactId>dependency>

2.2、配置连接(application.properties)

#springboot所有的配置类,都有一个自动配置类,redis的是RedisAutoConfiguration#自动配置类都会绑定一个properties配置文件,RedisProperties#配置reidsspring.redis.host=192.168.20.128spring.redis.port=6379#连接池使用lettuce,而不是jedis连接池,springboot中jedis连接池很多类不存在所以不生效

2.3、测试使用

//注入SpringData提供的redisTemplate@Autowiredprivate RedisTemplate redisTemplate;@Testvoid contextLoads() {    //操作类型,api和基本命令基本一样    //操作字符串    redisTemplate.opsForValue().set("mykey1","xls");    Object mykey = redisTemplate.opsForValue().get("mykey1");    System.err.println(mykey);    //操作list    redisTemplate.opsForList();    //操作set    redisTemplate.opsForSet();    //操作zset    redisTemplate.opsForZSet();    //操作hash    redisTemplate.opsForHash();    //操作HyperLogLog(基数算法)    redisTemplate.opsForHyperLogLog();    //操作geo(地理位置)    redisTemplate.opsForGeo();    //除了基本的操作,我们常用的方法都可以直接通过redisTemplate操作,比如事务和基本的crud    redisTemplate.multi();    redisTemplate.exec();    redisTemplate.discard();    redisTemplate.delete("");    //获取reids的连接对象    RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();    connection.flushDb();    connection.flushAll();    }

2.3 替换redisTemplate方法

由于调用提供的redisTemplate存入数据时会进行转义(默认使用的是JDKSerializable序列化)。

自定义redisTemplate可以指定序列化方法

使用时依赖注入自定义类返回的RedisTemplate,如果没成功可用@Qualifier("redisTemplate")注解标注

@Autowired@Qualifier("redisTemplate")private RedisTemplate redisTemplate;
@Configurationpublic class RedisConfig {    //固定模板,在企业中可直接使用    //自定义一个redistemplate    @Bean    @SuppressWarnings("all")    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)            throws UnknownHostException {        //修改方便使用的泛型        RedisTemplate<String, Object> template = new RedisTemplate<>();        template.setConnectionFactory(redisConnectionFactory);        //jackson序列化配置        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);        ObjectMapper om=new ObjectMapper();        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);        jackson2JsonRedisSerializer.setObjectMapper(om);        //String序列化配置        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();        //key采用string的序列化        template.setKeySerializer(stringRedisSerializer);        //hash采用string序列化        template.setHashKeySerializer(stringRedisSerializer);        //value序列化采用jackson        template.setValueSerializer(jackson2JsonRedisSerializer);        //hash的value采用jackson序列化        template.setHashValueSerializer(jackson2JsonRedisSerializer);        template.afterPropertiesSet();        return template;    }}

2.4 RedisUtil

自定义的redis工具类:

进一步封装template提供的方法,可省略重复的Try-catch,空值判断等

三、redis.config文件

1、配置文件单位、大小写不敏感

2、引入其他配置文件

3、网络

#绑定ip,设置127.0.0.1可本机访问,设置成0.0.0.0可供外部连接bind 127.0.0.1protected-mode yes #保护模式port 6379 #端口设置

4、通用 GENERAL

daemonize yes  #以守护进程方式运行,默认是no,需要自己开启为yespidfile /var/run/redis_6379.pid #如果以后台方式运行,需要指定pid文件#日志# Specify the server verbosity level.# This can be one of:# debug (a lot of information, useful for development/testing)  测试环境# verbose (many rarely useful info, but not a mess like the debug level)# notice (moderately verbose, what you want in production probably)  生成环境# warning (only very important / critical messages are logged)loglevel notice#日志的文件位置名,如果为空为标注的输出logfile ""#数据库的数量databases 16#是否总是显示logoalways-show-logo yes

5、快照

持久化,在规定的时间内,执行了多少次操作就会持久化到文件 .rdb.aof

redis是内存数据库,没有持久化,数据断电即失;

#在900秒内,至少有1个key进行了修改,就进行持久化操作save 900 1#在300秒内,至少有10个key进行了修改,就进行持久化操作save 300 10#在60秒内,至少有10000个key进行了修改,就进行持久化操作save 60 10000#可以设置自己的持久化策略#持久化如果出错了,redis是否还继续工作stop-writes-on-bgsave-error yes#是否压缩rdb文件,需要消耗一些cpu的资源rdbcompression yes#保存rdb文件时,进行错误校验rdbchecksum yes#rdb文件保存目录dir ./

6、replication 复制 (主从复制时讲解)

7、SECURITY 安全密码

设置密码,默认没有密码

#  设置密码方式一,命令修改[root@localhost bin]# redis-cli    127.0.0.1:6379> ping    PONG    127.0.0.1:6379> config set requirepass "123456" #设置密码    OK    127.0.0.1:6379> config get requirepass #获取密码    1) "requirepass"    2) "123456"    127.0.0.1:6379> auth 123456  #使用密码重新登录    OK    127.0.0.1:6379> ping    PONG
# 设置密码方式二,redis.conf文件的requirepass值requirepass 密码

8、限制CLIENTS

Redis提供6种数据淘汰策略

#设置客户端最大连接数量maxclients 10000#最大内存容量maxmemory #内存达到上限之后的处理策略maxmemory-policy noevictionRedis提供6种数据淘汰策略:    1、volatile-lru:从已设置过期时间的内存数据集中挑选最近最少使用的数据 淘汰;    2、volatile-ttl: 从已设置过期时间的内存数据集中挑选即将过期的数据 淘汰;    3、volatile-random:从已设置过期时间的内存数据集中任意挑选数据 淘汰;    4、allkeys-lru:从内存数据集中挑选最近最少使用的数据 淘汰;    5、allkeys-random:从数据集中任意挑选数据 淘汰;    6、no-enviction(驱逐):禁止驱逐数据。(默认淘汰策略。当redis内存数据达到maxmemory,在该策略下,直接返回OOM错误);

9、APPEND ONLY模式 aof模式

#默认不开启aof模式。默认使用rdb方式持久化,大部分情况下够用appendonly no#持久化文件的名字appendfilename "appendonly.aof"# appendfsync always #每次修改都会同步sybc,消耗性能appendfsync everysec #每秒执行一次sync,可能会丢失这1s数据# appendfsync no  #不执行同步sync,这个时候操作系统自己同步数据,速度最快

具体配置在redis持久化配置中详解

四、Redis持久化

redis是内存数据库,如果不将内存中的数据存入磁盘,那么一旦服务进程退出,服务器中的数据库状态也会消失,所以需要持久化功能。

RDB(Redis DataBase)

在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是Snapshot快照,它恢复时是将快照文件直接读到内存中。

redis会单独创建一个子进程(fork)来进行持久化,会先将数据写入一个临时文件中,等持久化过程都结束了,再用这个临时文件替换上次的持久化文件。整个过程中,主进程不进行任何的IO操作,这确保了极高的性能。如果需要进行大规模的数据恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加高效,RDB缺点是最后一次持久化后的数据可能丢失。默认的是RDB,一般情况下不需要修改配置。

RDB保存的文件是/usr/local/bin/dump.rdb,都是在配置文件中的快照中进行配置的。

生成环境将dump.rdb备份。

# The filename where to dump the DBdbfilename dump.rdb

优点:

1、适合大规模的数据恢复

2、对数据的完整性要求不高

缺点:

1、需要一定的时间间隔进程操作,如果redis意外宕机了,这个最后一次修改数据就没有了;

2、fork进程的时候,会占用一定的内容空间。

AOF(append only file)

将所有命令都记录下来,history,恢复时就把这个文件全部执行一遍。

以日志的形式来记录每个操作,将Redis执行过的所有指令记录下来(读操作不记录),只许追加文件,不可以改写文件,redis启动之初会读取该文件重新构建数据库。

AOF保存的时appendonly.aof文件

appendonly no   #默认不开启,修改appendonly为yes就开启了aof模式,重启redis即可生效appendfilename "appendonly.aof" #持久化的文件名# aof执行策略# appendfsync always  #每一次操作都追加,消耗性能appendfsync everysec  #每秒执行一次,可能会丢失这一秒的数据# appendfsync no      #不执行 sync,这个时候操作系统自己同步数据,速度最快

redis-check-aof修复aof文件

appendonly.aof文件损坏,redis将无法启动(dump.rdb文件也没有的情况下)。

/usr/local/bin/redis-check-aof 用于修复损坏的aof文件

redis-check-aof --fix appdendonly.aof

文件重写机制说明

aof默认就文件无限追加,文件会越来越大。

重写机制:如果aof文件大于64m,fork一个新的进程来将文件进行重写,保证文件不会太大。

no-appendfsync-on-rewrite no    #默认关闭重写机制,开启yesauto-aof-rewrite-percentage 100 #上次aof文件大小auto-aof-rewrite-min-size 64mb  

优点:

1、每一次修改都同步,文件完整性会更好

2、每一秒同步一次,可能会丢失一秒的数据

3、从不同步,效率最高

缺点:

1、相对于数据文件来说,aof远远大于rdb,修复速度也比rdb慢;

2、aof运行效率也比rdb慢,所有redis默认rdb

扩展:

1、rdb持久化方式能够在指定时间间隔内对你的数据进行快照存储;

2、aof持久化方式记录每次对服务器的写操作,当服务器重启时会重新执行这些命令来恢复原始数据,AOF命令以redis协议追加保存每次写的操作到文件末尾,redis还能对AOF文件进行后台重写,使得aof文件体积不至于太大;

3、只做缓存,如果只希望你的数据在服务器运行的时候存在,也可以不使用任何持久化;

4、同时开启两种持久化方式

  • 在这种情况下,当redis重启时会优先载入aof文件来恢复原始数据,因为在通常情况下aof文件保存的数据集要比rdb文件保存的数据集完整

  • rdb的数据不实时,同时使用两者时服务器重启也只会找aof文件,但是不建议只使用aof方式,因为rdb更适合用于备份数据库(aof在不断变化不好备份),快速重启,而且不会有aof可能潜在的bug,留着作为万一手段

5、性能建议

  • 因为rdb文件只用作后备用途,建议只在slave(从机)上持久化rdb文件,而且只要15分钟备份一次就够了,只保留save 900 1这条规则

  • 如果enable AOF,好处是在最恶劣的情况下也只会丢失不超过2s的数据,启动脚本较简单只load自己的AOF文件就可以了,代价一是带来了持续的IO,二是AOF rewrite的最后将rewrite过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。只要硬盘允许,应尽量减少AOF rewrite的频率,AOF重写的基础大小默认值64m太小,可以设置到5G以上,默认超过原大小100%重写,也可以改到适合的值

  • 如果不Enable AOF,仅靠Master-Slave Repllcation实现高可用性也可以,能省掉一大笔IO,也减少了rewrite时带来的系统波动。代价是如果Master/Slave同时挂掉,会丢失十几分钟的数据,启动脚本也要比较两个Master/Slave中的rdb文件,载入较新的那个,微博就是这种架构。

五、Redis发布订阅

redis发布订阅(pub/sub)是一种消息通信模式,订阅者(sub)接收消息。微博、微信、关注系统。

指令:

 # 订阅一个或多个频道 psubdcribe pattern [pattern] #查看订阅于发布系统状态 pubsub subcommand [argument [argument ...]] #将信息发送到指定频道 publish channel message #退订给定模式的频道 punsubscribe [pattern [pattern ...]] #订阅频道 subscribe channel [channel ...] #退订给定频道 unsubscribe [channel [channel ...]]

原理:

通过subscribe命令订阅某频道后,redis-server里维护了一个字典,字典的键就是一个个channel,而字典的值则是一个链表,链表中保存了所有订阅这个channel的客户端。subscribe命令的关键就是将客户端添加到给定的channel的订阅链表中。

通过publish命令向订阅者发送消息,redis-server会使用给定的频道作为key,在他所维护的channel字典中查找订阅了这个评到的所有客户端链表,遍历这个链表,将消息发布给所有订阅者。

使用场景

1、实时消息系统;

2、实时聊天系统;

3、订阅,关注等

稍微复杂一点的系统,选择用中间件来做。

六、Redis主从复制

1、概念

主从复制:是指一台redis服务器的数据,复制到其他redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower);数据的复制是单向的,只能由主节点到从节点。master以写为主,slave以读为主。

默认情况下,每台redis服务器都是主节点,且一个主节点可以有多个从节点(或没有),但一个从节点只能有一个主节点。

2、主从复制的作用

  1. 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式;

  2. 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复,实际上是一种服务冗余;

  3. 负载均衡:在主从复制基础上,配合读写分离,可以由主节点提供写服务,从节点提供读服务,分担服务器负载;尤其是在写少读多情况下,通过从节点分担读负载,可以大大提高redis服务的并发量;

  4. 高可用(集群)基石:主从复制还是哨兵和集群能够实施的基础,因此它是redis高可用的基石

一般来说工程项目中,一台redis是不够的(框架中一般使用一主二从)

  1. 单个redis服务器会发生单独故障,并且单台服务器请求压力较大;

  2. 单个redis内存容量有限,一台redis服务器内存容量为256G,但是不能将所有内存用作redis存储内存,一般redis最大使用内存不超过20G

3、环境配置(搭建伪集群)

查看redis库的信息,默认情况下每台redis都是主节点,我们只用配置从机;

127.0.0.1:6379> INFO replication# Replicationrole:master  #角色connected_slaves:0 #从机个数master_replid:9777390da8ab158625cf8ec409c3741aba9fe6a8master_replid2:0000000000000000000000000000000000000000master_repl_offset:0second_repl_offset:-1repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0

1、复制配置文件,修改port,pid名字,log文件名,dump文件名

这里只是由于在同一台服务器上实验主从复制,所以修改端口等来避免多个redis进程冲突。

[root@VM-0-16-centos rconfig]# lsredis79.conf  redis80.conf  redis81.conf  redis.conf

2、启动不同端口的redis

[root@VM-0-16-centos bin]# redis-server rconfig/redis79.conf [root@VM-0-16-centos bin]# redis-server rconfig/redis80.conf [root@VM-0-16-centos bin]# redis-server rconfig/redis81.conf [root@VM-0-16-centos bin]# ps -ef|grep redisroot     24750     1  0 15:39 ?        00:00:00 redis-server 0.0.0.0:6379root     24920     1  0 15:40 ?        00:00:00 redis-server 0.0.0.0:6380root     24941     1  0 15:40 ?        00:00:00 redis-server 0.0.0.0:6381root     24958 19799  0 15:40 pts/0    00:00:00 grep --color=auto redis

3、修改配置实现主从复制(一主二从)

127.0.0.1:6380> SLAVEOF 127.0.0.1 6379 #配置主机OK127.0.0.1:6380> INFO replication# Replicationrole:slavemaster_host:127.0.0.1master_port:6379master_link_status:down...
127.0.0.1:6381> SLAVEOF 127.0.0.1 6379 #配置主机OK

命令配置重启失效,通过配置文件配置如下

#REPLICATION中,一下命令注释取消,配置对应的主机ip、端口和密码,保存即可# replicaof # masterauth 

查看主机信息更改

127.0.0.1:6379> INFO replication# Replicationrole:masterconnected_slaves:2slave0:ip=127.0.0.1,port=6380,state=online,offset=1008,lag=1slave1:ip=127.0.0.1,port=6381,state=online,offset=1008,lag=0

细节

  1. 从机无法写入数据

# 主机6379,从机6380,6381127.0.0.1:6380> set key5 test5(error) READONLY You can't write against a read only replica.

2. 从机可以获取主机写入的信息

3.主服务器挂掉,从服务器还是从服务器,需要手动将从服务器切换为主服务器。如果是配置文件配置的需要修改配置文件,如果是命令行修改的需要执行slaveof no one 命令切换成主服务器

4、复制原理

slave启动成功连接到master后发送一个sync命令

master收到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台进程执行完毕后,master将传送整个数据文件到slave,并完成一次完全同步。

全量复制:slave服务器在接收到数据文件后将其存盘并加载到内存中;

增量复制:master继续将新搜集到的修改命令依次传给slave,完成同步;

只要重新连接master,完全同步(全量复制)将自动进行。

六、哨兵模式(自动选举主机模式)

1、概述

主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,还会造成一段时间能服务不可用。所以优先考虑哨兵模式。

哨兵模式能够监控后台主机是否有故障,如果故障根据投票数自动将从数据库换为主数据库。

原理

哨兵为一个独立的进程,哨兵通过发送命令,等待redis服务器响应,从而监控运行的多个redis实例

redis查看某一个key的大小_Redis笔记相关推荐

  1. redis查看某一个key的大小_redis查看某个key redis中key的操作命令 - Redis - 服务器之家...

    redis查看某个key redis中key的操作命令 发布时间:2017-04-02 来源:服务器之家 在该系列的前几篇博客中,主要讲述的是与Redis数据类型相关的命令,如String.List. ...

  2. redis查看某一个key的大小_redis查询key的内存大小

    通过redis-rdb-tools工具进行查询. 1.环境:centos7.x.python2.7.7 查询python版本:python -V 2.安装pip: 下载:wget https://bo ...

  3. redis 查看key的有效期_你经常忽略的Redis常见面试题,精选给你整理

    ‍ 文章来自:https://www.cnblogs.com/jasontec/p/9699242.html 作者:yuanchuang 点击加入:PHP自学中心交流③群 商务合作: 请加微信(QQ) ...

  4. redis查看key的过期时间_面试官:你在Redis中设置过带过期时间的Key吗?

    点击上方小伟后端笔记关注公众号 每天阅读Java干货文章 熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除. 在为key设置过 ...

  5. redis复制key的数据_Redis常见面试题

    介绍:Redis 是一个开源的使用 ANSI C 语言编写.遵守 BSD 协议.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的 API的非关系型数据库. 传统数据 ...

  6. redis key命名规范_Redis几个实战经验积累

    redis是一种nosql数据库,他的数据是保存在内存中,同时redis可以定时把内存数据同步到磁盘,即可以将数据持久化,并且他比memcached支持更多的数据结构(string,list列表[队列 ...

  7. redis集群扩容和缩容_redis集群cluster搭建,扩容缩容

    1.    概要说明 1.1.    概述 本文旨在说明平台部署环境搭建的过程和详细步骤说明,为后面系统部署提供清晰的参考依照. 以下搭建部署的环境,为一个小型的分布式集群环境.满足负载均衡和单点故障 ...

  8. Redis缓存设计(key、value设计)与性能优化(缓存击穿、缓存穿透、缓存雪崩)

    一.多级缓存架构 二.缓存设计 1.缓存穿透 缓存穿透是指查询一个根本不存在的数据, 缓存层和存储层都不会命中, 通常出于容错的考虑, 如果从存储层查不到数据则不写入缓存层. 缓存穿透将导致不存在的数 ...

  9. Redis中查找大key

    首发于 https://segmentfault.com/a/11... redis-cli提供的方法 注意以下所有试验基于redis 5.0.3版本 redis-cli 提供一个bigkeys参数, ...

最新文章

  1. iPhone开源项目汇总(更新版)
  2. linux(gentoo)安装配置conky
  3. Android PC投屏简单尝试—最终章1
  4. vue+axios天气查询——天知道效果展示及源码分析
  5. js实现下拉框多选_bootstrap基础快速入门-10 dropdown下拉框
  6. 基于线性回归的波士顿房价预测
  7. leftjoin多了性能下降_MySQL 性能优化总结
  8. CSS样式(一)- 基本语法
  9. 基于.NET实现数据挖掘--聚类分析算法
  10. 用户、角色、权限表的设计(mysql)
  11. 关于凸包算法和叉积的应用
  12. 《现代操作系统》知识点整理
  13. 123D画一个产品外壳3d图给3d打印机打印完整流程
  14. java 等额本金与等额本息
  15. 转载 | 深度学习中的遥感影像数据集
  16. mysql查询当前用户中所有的表空间_oracle查看用户所在的表空间
  17. python简单实现经典的图像匹配算法SIFT
  18. 群发邮件进入垃圾邮件的解决之道
  19. 小程序输入框字数统计
  20. 北华大学计算机考研资料汇总

热门文章

  1. 【java】ASM代理方式 Byte-Buddy代理方式 Javassist代理方式
  2. Spring Boot : Spring Boot Slf4j 以及 log4j 以及门面日志
  3. 【Flink】Flink 基于事件序列最大值 AssignerWithPeriodicWatermarks
  4. Spark Structured Straming:'writeStream' can be called only on streaming Dataset/DataFrame
  5. Solr如何管理索引库
  6. 华为上机试题 c语言,华为上机考试题库2017 2017年全国计算机等级考试C语言上机考试题库 -1-20套.doc...
  7. linux过滤文件的关键字,linux tail 过滤日志文件中的关键字
  8. Java多线程学习三:有哪几种实现生产者消费者模式的方法
  9. js 跳转到 百度指定地址定位点
  10. [ 转载 ] Java基础12--基础学习总结——数组