redis

Redis

1.基础配置

  1. 版本

    1. 3.x之前不支持分布式安装
    2. 3.x之后支持分布式安装
  2. 优缺点

  3. 单个redis容易发生单点故障,一台服务器很难处理大量内存.

  4. redis可用的存储空间有限,即使是打野不能用

  5. 配置文件

    ./redis/redis.conf

名称 作用 行号 注意事项
daemonize no 设置为守护线程 136 yes:守护线程
bind 127.0.0.1 可以连接的地址 69 注释掉设置为远程登录
port 默认端口号 93
pidfile pid文件地址 设置pid的文件 159 只有设置为守护线程才生效
logfile 日志文件 设置日志保存文件 172 设置为守护线程默认为:/dev/null
datqabases 16 设置存储库数量 187 默认16个
save 10 1 10秒钟有1个key持久化到硬盘 219-221 三个条件满足其中一个就持久化
rdbcompression yes 本地存储数据是否进行压缩 252 yes:开启默认开启
dbfilename 持久化文件 设置持久化备份的库文件 254
dir 指定数据存储位置 指定数据库保存的位置 264 默认redis目录下
requirepass foobared 设置密码 508 默认注释(redis3.0之后必须设置),通过"-a 密码"进行连接,明文书写即可,java通过auth连接
maxclients 设置并发线程连接数 540 默认注释没有限制
maxmemory 指定Redis最大内存 567 默认注释,默认值256M(建议1g分配256-512)
  1. LRU

搜索lru进行配置,只需要配置一个模式

名称 作用 注意事项
volatile-lru 删除最不常用的超时数据 后面配置超时时间
allkeys-lru 查询所有key中最近最不常使用的数据进行删除 常被配置的模式
volatile-random 随机删除超时数据 后面配置超时时间
allkeys-random 查询所有数据后随机删除
volatile-ttl 查询所有超时数据,排序后删除 后面配置超时时间
noeviction 不进行处理,内存溢出时报错 默认配置
volatile-lfu 在所有超时数据中驱逐使用频率最少的键 4.0新功能
allkeys-lfu 在所有键中驱逐使用频率最少的键 4.0新功能 常见配置

2.redis命令

1.共有命令

操作成功几个数据返回几

  1. 查看所有key

    keys *
    
  2. 删除key

    del x [y..]
    
  3. 检测是否含有key

    exists x [y..]
    
  4. 清除时间

    1. 设置清除时间

      1. expire x 10
        
      2. 毫秒

        pexpire x 1000
        
    2. 查看清除时间

      1. 返回值

        返回值 作用 注意事项
        -1 永久有效
        -2 无效
        >0 剩余时间
      2. ttl x
        
      3. 毫秒

        pttl x
        
    3. 设置为永久有效

      persist x
      
  5. 返回随机KEY[不常用]

    random key
    
  6. 重命名KEY

    rename x y
    
  7. 查看数据类型

    type x
    
  8. 序列化

    dump x
    

2.String

最大的key为512mb,不会发生编码异常,在客户端编解码

用途:用户限制登录

  1. set增加数据

    可以覆盖之前的数据和类型

    set str 10
    
  2. mset批量增加

    mset str1 10 str2 x str3 20
    
  3. 查看一个数据

    get string
    
    key sitring:?[1,2]
    
  4. 批量查看

    mget str1 str2 str3
    
  5. getrange截取

    getRange str n1 n2
    
  6. getset返回之前的值,设置新值

    getset str 15//输出nil
    getset str 10//输出10
    
  7. strlen长度

    strlen str
    
  8. append判断追加

    key存在时追加值,key不存在时赋值

    append str 10
    
  9. setnx 判断赋值

    key存在时不进行操作,key不存在时赋值

    setnx str 10;
    
  10. 加减操作

只能对String类型的数值进行操作,以0开头的数值视为字符串,不书写n时为加减1,0不存在时从0开始计算

  1. 加1

    incr string
    
  2. 减1

    desr string
    
  3. 自增n

    incrby str n;
    
  4. 自减n

    decrby str n;
    
  5. 添加一个n秒的临时数据

    setex str n value
    

3.Hash

存储对象,类似于HashMap
  1. hset添加对象的一个属性

    hset user:1 id 1
    
  2. hmset批量添加对象的多个属性

    hmset user:1 id 1 name zhangsan
    
  3. hget 获取对象的一个属性值

    gset user:1 id
    
  4. hmset批量获取对象的多个属性值

    hgset user:1 id name
    
  5. hgetall获取对象的所有属性名和属性值

    hgetall user:1
    
  6. hdel删除对象的一个或多个属性

    hdel user:1 id [user]
    
  7. hsetnx存在属性时不操作,不存在属性时添加

    hsetnx user:1 id 1
    
  8. hexists检测是否存在属性

    返回值存在个数

    hexists user:1 id [name...]
    

4.List

用途:做流程

类似于linkedList
  1. lpush(从左侧(头部)开始添加,最先添加的是尾部最后一个)

    lpush friend x [x] [x]
    
  2. rpush(从尾)

    rpush friend x [x] [x]
    

  3. rpushx:最右侧添加(不受1/2的影响)

    rpushx key x
    
  4. lpushx:最左侧添加(不受1/2的影响)

    lpushx key x
    
  5. lrange:查看n1-n2的值(可以实现分页)

    负数代表从后开始数第几个,例如-1代表最后一个

    lrange friend n1 n2
    
  6. lpop:从头部弹出,弹出就没了(删除)

    lpop friend
    
  7. rpop:从尾部弹出

    rpop friend
    
  8. brpop:从头部弹出,没值的话等待1000秒,有值就弹出(等待时代表全部弹出,这个key就被删除了,需要重新赋值)

    blpop key 1000
    
  9. blpop:从尾部弹出,如果在1000秒之后有值就弹出

    blpop key 1000
    
  10. rpoplpush:从friend1右侧弹出从friends头部插入

    rpoplpush friend1 friend2
    
  11. lset:更改下标为n的key的值为x

    lset key n x
    
  12. linset:将x插入下标为n的key的前面或后面

    linsert key before|after n x
    
  13. llen:长度

    llen key
    
  14. lindx:显示下标为n的key值

    lindex key n
    

5.Set

类似于hashtable:无序不重复

  1. sadd:添加数据

    sadd key a b c
    
  2. scard:获取数据数

    scard key
    
  3. smembers:获取所有数据

    smembers key
    
  4. sismember:查询是否存在a数据

    sismember key a
    
  5. srandmember:返回集合中一个或n个数据

    srandmember key [n]
    
  6. srem:删除key中的一个或多个数据

    srem key a [b]
    
  7. spop:随机删除key中一个或n个数据并返回删除的值

    spop key [n]
    
  8. smove:将一个数据移动到另一个key

    将key1中的a移动到key2中

    smove key1 key2 a
    
  9. 差集:

    1. sdiff:查询交集之外的不相同的数据

      sdiff key1 key2 [key3]
      
    2. sdiffstore:脚趾之外的不同的数据复制到key中

      sdiiffstore key key1 key2 [key3]
      
  10. 交集:

    1. sinter:查询共有数据

      sinter key1 key2 [key3]
      
    2. sinterstore:共有数据并复制到key中

      sinterstore key key1 key2 [key3]
      
  11. 并集:

    1. sunion:查询所有数据

      sunion key1 key2 [key3]
      
    2. sunionstore:所有数据并复制到可以中

      sunionstore key key1 key2 [key3]
      

6.Zset

用途:排行榜

有序集合且不允许重复,但是通过一个double分数来排列顺序,分数可以重复

  1. zadd:增加一个或多个数据

    zadd key 分数 a [分数 b]
    
  2. zcound:查看分数1-分数2的成员个数

    zcard key 分数1 分数2
    
  3. zrange:通过从低到高查看下标0-n之间的数据

    zrage key 0 n
    
  4. zrevrange:通过从高到第查看下标0-n之间的数据

    zrevrange key 0 n
    
  5. zrem:删除数据

    zrem key a [b]
    
  6. zremrangebybank:删除下标0-n之间的数

    zremrangebybank key 0 n
    
  7. zremrangebyscore:删除分数之间的数

    zremrangebycore key 分数1 分数2
    

3.redis操作

1.发布订阅

  1. 作用:

    订阅频道,从而接收数据

  2. subscribe:订阅频道:处于接收状态

    subscribe 频道 [频道1]
    
  3. publish:向指定频道发送信息

    publish 频道 信息
    
  4. unsubscribe:退订频道

    unsubcribe
    
  5. punsubscribe:退订所有频道

    punsubscribe
    

2.多数据库

  1. select:切换数据库

    [0-15]默认16个数据库

    select n
    
  2. move:移动数据到另一个数据库

    move key n
    
  3. flushdb:删除当前数据库的所有key

    flushdb
    
  4. flushall:删除每个数据库的所有key

    flushall 
    

3.事务

​ 用途:一组行为执行时:秒杀活动

  1. multi:开始事务

    multi
    
  2. exec:执行

    数据出错:只有出错的语句不会被执行

    语法错误(报告错误):都不会被执行,会自动回滚

    exec
    
  3. discard:回滚(放弃执行)

    discard
    
  4. watch:

    1. 监视一个或多个key,如果这个key在事务期间被更改,那么当exec时就会回滚,并取消监视
    2. multi之前执行,如果执行excidiscard就会自动取消监视
    watch key [key]
    
  5. unwatch:取消所有监视

    unwatch [key] [key]
    

4.持久化

1.RDB

  1. 基础知识:

    1. 默认开启
    2. 定期将内存中的数据做成快照保存在磁盘中
    3. 默认存储在redis目录下,名为dump.rdb
  2. 优缺点

    1. 优点:保存和读取数据都很快
    2. 缺点:
      1. 小机器不适合做快照
      2. 在非正常关机时无法保存
  3. 快照条件:

    1. 执行shutdown正常关闭时
    2. 执行flushall删除所有key时
    3. 在指定时间间隔内
    4. 执行save命令
  4. 恢复rdb:

    将dump.rdb文件拷贝到redis下的bin目录即可

2.AOF

  1. 基础知识:

    1. 执行操作之后会将操作写在日志中,如果出现问题可以回滚
    2. 每做一次写操作都会,就会将操作追加到appendoly.aof中,当redis重启时就会重新读取整个数据库
  2. 启动AOF,修改配置文件:

    1. 启动AOF:699默认no

      appendonly yes
      
    2. 指定存储文件名:703

      appendfilename "appenonly.aof"
      
    3. 指定跟新日志条件:728默认注释

      appendfsync 条件
      
      1. always:写操作一次就写入一次:
      2. everysec:每秒钟写入一次:性能和持久化居中
      3. no:完全依赖os,性能最好,持久化没保证
    4. 配置重写机制

      当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发。一般都设置为3G,64M太小了。

      auto-aof-rewrite-percentage 100
      auto-aof-rewrite-min-size 64mb
      
  3. 恢复AOF

    1. 直接复制到bin目录下

    2. 通过命令

      redis-check-aof --fix appendonly.aof
      

5.数据一致性

1.实时同步

数据库与redis

@cacheable:查询时使用,注意Long类型需转换为String类型,否则会抛异常

@CatchPut:更新时使用,使用此注解,一定会从DB上查询数据

@CacheEvicat:删除时使用;

@Caching:组合用法:

2.异步队列

消息中间件:kafka

3.主从复制

可以使用阿里插件:canal也可以用下列方法

  1. 修改从服务器redis配置文件

    1. port:6380(重新修改端口号):此端口是从服务器的端口号
    2. slaveof 127.0.0.1 6379(指定主服务器和端口号用于连接主服务器)
  2. 或者使用命令切换主从服务器

    1. slaveof ip地址 端口号 变回从服务器:只能进行查
    2. slaveof on one 变回主服务器
  3. slavef 查询新的master

    slaveof new master

4.其他

  1. udf自定义函数
  2. 脚本

5.相关知识点

  1. 数据库穿透:

    可能查询到的是null数据,null数据不会写入redis缓存,而是返回查询失败,更多的人访问最后导致宕机,因此可以设置如果数据库查询到的是null的话就添加key但是值是null;

  2. 雪崩:

    缓存集中在同一时间段失效,导致大量用户进入数据库查询产生数据穿透

    1. 分析用户行为,找到合适的时间点失效
    2. 加锁或者队列
    3. 缓存预热
  3. 热点key:

4.Cluster集群

1.基础知识

  1. 无中心,无需连接所有的服务器

  2. 必须要3master+3slaveof才能配置成集群

  3. 共有0-16383共16384个hash曹,个人服务器均分

  4. 容错性(投票):当一个服务器在半数以上的服务器无法连接时视为当前无服务挂掉

  5. 节点分配:A(0-5460)B(5461-10922)C(10923-1638)

    如果增加新的服务器则分别从ABC的前面出去一部分最后达成均分

  6. 真集群和假集群以下为假集群的创建规则

2.搭建流程

1.修改配置文件

  1. 复制配置文件

    1. 创建Redis节点安装总目录

      mkdir /usr/local/redis_cluster
      
    2. 创建Redis节点安装目录(复制5份redis配置文件(7001-7005))

      cp `~/redis.conf /usr/local/redis_cluster/7001/
      
  2. 修改配置文件

    参数 作用 行号
    #bind ip地址 注释bind IP:不设置地址 69
    protected-mode no 不允许公网访问(真集群设置为允许) 88
    port 7001 修改端口号 92
    daemonise yes 允许后台运行 136
    pidfile /var/run/redis-7001.pid 修改pid进程文件.默认以pid命名名称 158
    logfile 存放地址/redis.log 修改日志文件地址,可不修改 171
    dir 存放地址 修改数据文件存放地址,以端口号为目录名区分,可不修改 263
    #requirepass redisyangtuo 不设置密码 507
    cluster-enable yes 启用集群 832
    cluster-config-file node-7001.conf 修改节点的配置文件 840
    cluster-node-timeout 15000 配合集群节点的超时时间,使用默认 846
  3. 启动并查看

    1. 启动5份redis

      redis-server /配置文件
      
    2. 查看是否启动

      ps -ef |grep redis
      
    3. 关闭reids

      redis-cli -p 7001 shutdown
      

2.安装软件

1.ruby

redis-trib.rb的依赖

建议编译安装,而不是下列方法

yum -y install ruby ruby-devel rubygams rpm-build
2.rvm

用于更新ruby,官方文档:https://www.rvm.io/rvm/install

stable:最新版 master:最新开发版

  1. 安装rvm官方的两个gpg秘钥

    1. 标准方法(经常失败:原因未知)

      gpg2 --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
      
    2. 替代方法

      curl -sSL https://rvm.io/mpapis.asc | gpg --import  - 
      curl -sSL https://rvm.io/pkuczynski.asc | gpg --import  - 
      
  2. 安装rvm

    1. 标准安装

      \curl -sSL https://get.rvm.io | bash -s stable
      
    2. 使用ruby安装rvm

      \curl -sSL https://get.rvm.io | bash -s stable --ruby
      
  3. 检验安装情况

    find / -name rvm -print
    
  4. 加载配置文件

    1. 普通加载

      source /usr/local/rvm/scripts/rvm
      
    2. 设置环境变量(官方脚本:全局)

      source /etc/profile.d/rvm.sh
      
  5. 升级rvm

    rvm get stable
    
  6. 查看ruby版本

    rvm list known
    
  7. 安装最最新版ruby

    rvm install 2.6.3
    
  8. 使用一个ruby版本

    rvm use 2.6.3
    
  9. 设置默认ruby版本

    rvm use 2.6.3 --default
    
  10. 查看ruby版本

    ruby --version
    
  11. 安装redis与ruby整合工具

    gem isntall redis
    

3.创建启动

  1. 创建redis_cluster

    1. 3.0-4.0

      redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.1:7005
      
    2. 5.0:不需要安装ruby

      redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1
      

    先出的结果为主,输入yes

  2. 连接reids

    -c:连接集群 -p:访问7001

    redis-cli -h 127.0.01 -c -p 7001
    
  3. 查看节点测试:redis命令

    info replication
    
  4. 查看所有节点信息:redis命令

    每个节点都有一个id,用节点来对应,可以更改端口号

    主用来set,从用来get,若果set就会跳到get中

    cluster nodes
    

4.集群管理

  1. 添加单个集群

    add-node
    
  2. 删除单个集群

    del-node
    
  3. 删除全部集群

    1. 关闭所有集群
    2. 删除nodes-port.conf配置文件
    3. 重建集群

4.相关方法

  1. 新建对象

    @Autowired
    	private RedisTemplate<String,String> redisTemplate;
    	
    	public String getString(String username) {
    		ValueOperations<String, String> string = redisTemplate.opsForValue();
    		if(redisTemplate.hasKey(username)) {//redis中有,直接输出
    			System.out.println("在redis中查找:");
    			return string.get(username);
    		}
    		else {//redis中没有数据,在mysql中查找后赋值(模拟),并输出
    			String age="15";
    			string.set(username, age);
    			System.out.println("在mysql中查找:");
    			return age;
    		}
    	}
    
  2. 语法规律

    公用redis语法对应redisTemplate静态方法

    私有redis语法对应redisTemplate.ospFor***()

7.java操作

1.jedis直连

  1. pom.xml

    jedis/Redisson

    <dependency>
    	<groupId>redis.clientsgroupId>
    	<artifactId>jedisartifactId>
    	<version>2.9.0version>
    dependency>
    
  2. 连接redis

    Jedis jedis = new Jedis("111.230.23.216",6379);
    
  3. 输入密码

    jedis.auth(密码);
    
  4. 检测连通性

    输出ping=pong时连接成功

    String ping = jedis.ping();
    

2.redis池

1.配置池

不配置的话,默认最大连接数和空闲数是8

  1. 新建对象

    redisPoolConfig rfg = new redisPoolConfig();
    
  2. 设置最大连接数

    rfg.setMaxTotal(5);
    
  3. 设置最大空闲数

    rfg.setMaxIdle(1);
    

2.连接池

  1. jedisPool

    JedisPool jp = new JedisPool(rfg,111.230.13.216[,连接时间,密码]);
    
  2. 获取jedis

    Jedis jedis = jp.getResource();
    
  3. 输入密码

    jedis.auth("密码");
    

3.工具类

可以再写别的内容:例如添加key或者设置过期时间

public class RedisPoolUtil {
	
	static private JedisPool jp;
	static {
		//1.配置库
		JedisPoolConfig jpc = new JedisPoolConfig();
		jpc.setMaxTotal(5);
		jpc.setMaxIdle(1);
		String path = "111.230.13.216";
		int port = 6379;
		jp = new JedisPool(jpc,path,port);
	}
	
	public static Jedis getJedis() {
		Jedis jedis = jp.getResource();
		return jedis;
	}
	
	public static void close(Jedis jedis) {
		jedis.close();
	}
}

6.SpringMVC

1.添加依赖

  1. pom.xml

    
    <dependency>
    	<groupId>redis.clientsgroupId>
    	<artifactId>jedisartifactId>
    	<version>2.9.0version>
    dependency>
    
    <dependency>
    	<groupId>org.springframework.datagroupId>
    	<artifactId>spring-data-redisartifactId>
    	<version>1.8.4.RELEASEversion>
    dependency>
    
  2. 版本对照表

    必须对应特定的版本,否则就会报错,可以ctrl+鼠标点击spring-data-redis点击查看对应版本

    spring-data-redis版本 jedis版本 备注
    1.5.2.RELEASE 2.7.3
    1.6.0.RELEASE 2.7.2 2.7.3
    1.6.2.RELEASE 2.8.0
    1.8.1.RELEASE 2.9.0
    1.8.4.RELEASE 2.9.0

2.整合redis

sprng-redis.xml配置文件


<bean id="jedisPoolConfig"
	class="redis.clients.jedis.JedisPoolConfig">
	<property name="maxTotal" value="50">property>
	<property name="maxIdle" value="5">property>
bean>

<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
	<property name="hostName" value="111.230.13.216">property>
	<property name="port" value="6379">property>
	<property name="poolConfig" ref="jedisPoolConfig">property>
bean>

<bean id="redisTmplate" class="org.springframework.data.redis.core.RedisTemplate">
	<property name="connectionFactory" ref="jedisConnectionFactory" />
bean>

3.修改序列化

1.修改序列化

//<bean id="redisTmplate" class="org.springframework.data.redis.core.RedisTemplate">
	//<property name="connectionFactory" ref="jedisConnectionFactory" />
	
	<property name="keySerializer">
		<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
	property>
	<property name="valueSerializer">
		<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
	property>
//bean>

2.使用StringRedisTmplate

  1. 公用方法在redisTmplate中
  2. 私有方法在redisTmplate.ospValue/Hset

你可能感兴趣的:(管理)