2022-10-10 (≥▽≤) Redis数据库

1.Redis

NoSQL:Not Only SQL非关系型数据库

  • NoSQL的四大类:

    • 键值(Key-Value)存储数据库,使用到一个哈希表,这个表中有一个指针指向特定的数据:Redis,Memcache。
    • 列存储数据库:HBase。
    • 文档型数据库:MongoDB,SQLite,DB2(淘汰)。
    • 图形数据库:InfiniteGraph。
  • NoSQL应用场景:

    • 数据模型比较简单
    • 数据的灵活性更强
    • 对数据库性能要求比较高
    • 不需要高度的数据一致性
  • 非关系型数据库的作用:当做第三方的缓存

  • Redis特点:

    • Redis是K-V型数据库
    • Redis是有丰富的数据类型(五大数据类型)
    • Redis支持持久化存储
    • Redis是单线程的,线程安全,效率低
  • 安装Redis

    • 解压redis的压缩包
    • 由于redis是用C语言写的,安装之前需要C语言的依赖
      yum install -y gcc
    • 需要使用gcc对redis的安装文件进行编译
      make MALLOC=libc
    • 执行安装redis
      make install PREFIX=/usr/redis
    • 启动redis服务
      进入redis安装目录,进入bin目录,./redis-server
    • 启动redis的客户端
      进入redis安装目录,进入bin目录,./redis-cli -h localhost -p 6379

Redis指令

  • Redis清除库的指令:

    • FLUSHDB:清空当前库
    • FLUSHALL:清空所有库、
  • 切换库

    • select 库编号
  • set:存值

  • get:根据key获取value

  • keys *(代表任意位数的字符):获取全部key名

  • del:根据key删除value值,可以删除多个key对应的值

  • exists:判断指定的key是否存在(存在:1;不存在:0)

  • 通配符:

    • *:代表任意位数的字符

    • ?:代表一位字符

    • [ae]:a或e,只代表一位字符,如果有特殊符号,用\

  • move:把当前库的key移动到指定的库中

  • pexpire:设置key的过期时间,单位是毫秒

  • ttl:查看指定key设置的过期时间,单位是秒

  • pttl:查看指定key设置的过期时间,单位是毫秒

  • randomkey:随机获取一个key

  • rename:重命名一个key

  • type:查看指定key对应值的数据类型

Redis数据类型

1、string类型(字符串)

  • set:设置一个key-value
  • get:根据指定的key获取对应的value
  • mset:一次设置多个key-value
  • mget:一次获得多个key对应的值
  • getset:获取原始的key值的同时设置新的key值
  • strlen:获取对应key的value的长度
  • append:为指定的key追加内容
  • getrange:截取value的值的内容。-1代表截取到末尾
  • setex:设置一个key的过期时间,存活时间,单位是秒
  • psetex:设置一个key的过期时间,单位是毫秒
  • setnx:如果不存在就设置,如果存在,则不做任何操作
  • msetnx:可以同时设置多个key,是一个原子操作。
  • decr:自减1。
  • decrby:做减法计算
  • incr:自增1
  • incrby:做加法计算
  • incrbyfloat:做加法计算,参数可以是浮点型。

2、list类型(列表,类似于java中的list)

  • lpush:设置一个列表,在表头添加数据
  • lrange:获取一个列表区间内的元素
  • rpush:设置一个列表,在表尾添加数据
  • lpushx:保证这个key存在,在表头添加数据。
  • rpushx:保证这个key存在,在表尾添加数据。
  • lpop:移除并返回列表中左边的第一个元素
  • rpop:移除并返回列表中右边的第一个元素
  • llen:获取列表元素的个数
  • lset:设置某一个指定索引的位置的值(索引值必须正确)
  • lindex:获取某一个指定索引位置的元素
  • lrem:删除重复元素,可以指定删除的个数和具体的值。
  • ltrim:保留列表中特定区间的元素
  • linsert:在某一个元素之前|之后插入新元素

3.Set类型和zset类型

特点:Set集合是元素无序不可重复的

Ser指令

  • sadd:为集合添加元素

    • (sadd key ...value)
  • smembers:显示集合中所有的元素

    • (smembers key)
  • scard:返回集合中元素的个数

    • (scard key)
  • spop:随机返回一个元素,并将元素在集合中删除

    • (spop key)
  • smove:从一个集合中向另一个集合去移动元素

    • (smove key1 key2 value)————(从第一个集合向第二个集合中移动)
  • srem:从集合中删除一个元素

    • (srem key value)
  • sismember:判断一个集合是否含有某个元素

    • (sismember key value)
  • srandmember:随机获取集合中的n个元素

    • (srandmember key 数字)
  • sdiff:去掉第一个集合中与其他集合含有相同的元素,返回一个新的结果,原有集合里的数据不会真正删除

    • (sdiff key1 key2)
  • sinter:求交集

    • (sinter key1 key2)
  • sunion:求并集,求合集

    • (sunion key1 key2)

zset指令

特点:可排序的set集合,不可以重复

  • zadd:为集合添加元素,添加元素的同时要指定元素的分数
    • zadd key score1 value1 score2 value2 ....
  • zcard:返回集合中元素的个数
    • (zcard key)
  • zrange:按照分数的升序排列,可以选择带有score查询
    • zrange key 0 -1
  • zrevrange:按照分数降序排列
    • zrevrange key 0 -1
  • zrangebyscore:按照分数查找一个范围内的元素,可以分页
    • zrangebyscore key 0 20 withscores limit 0 1
  • zrank:返回排名
    • zrank key value
  • zrevrank:倒叙排名
    • zrevrank key value
  • zscore :查看一个元素的分数
    • zscore key value
  • zrem:删除某个元素
    • zrem key ...value
  • zincrby:给某一个特点的元素加分
    • zincrby key score value

4.hash类型

指令

  • hset:创建一个hash(key-value)类型
  • hget:获取一个key对应的value
  • hgetall:获取所有的k-v对
  • hdel:删除某一个k-v对
  • hexists:判断一个key是否存在
  • hkeys:获取所有的key
  • hvals:获得所有的value
  • hmset:设置多个k-v
  • hmget:获得多个key的value
  • hsetnx:设置一个不存在的k-v值
  • hincrby:为value自增
  • hincrbyfloat:为value自增,浮点数

redis远程连接

远程连接redis:

1、开放端口号

firewall-cmd --zone=public --add-port=7000/tcp --permanent
firewall-cmd --zone=public --add-port=6379/tcp --permanent
systemctl restart firewalld

2、配置redis允许远程连接

vim ../redis.conf

可以使用/搜索关键字

把bind改成0.0.0.0

2.Redis持久化机制

redis是用来做缓存的.

持久化:数据从内存->磁盘

两种持久化机制:

  • 快照(SNAPSHOT)RDB
  • AOF(Append Only File)只追加日志文件

快照

特点:这种方式可以把某一时刻的所有数据存入到磁盘中,Redis默认的持久化机制保存的文件是以rdb形式保存

快照生成方式

  • 通过客户端指令:BGSAVE或SAVE指令
  • 服务器配置自动触发
    • 配置文件中的触发策略
    • 关闭Redis服务

rdb文件就是快照持久化的核心(运维会定期备份rdb文件——shell脚本)

AOF持久化

保存你输入的命令。把操作数据的指令保存到一个aof文件里,默认不开启aof持久化——需要手动开启AOF持久化

  • AOF持久化会自动忽略查询指令,只记录写(对数据有更改)的指令

日志的追加频率

  • always:每个redis写的命令都要同步,降低Redis效率
  • everysec:每秒执行一次同步,有延迟
  • no:由操作系统决定何时同步。

如果AOF持久化和快照持久化同时开启,会以AOF为准

AOF文件具备了自我修复的能力。

./redis-check-aof --fix appendonly.aof

AOF文件重写

# This base size is compared to the current size. If the current size is
# bigger than the specified percentage, the rewrite is triggered. Also
# you need to specify a minimal size for the AOF file to be rewritten, this
# is useful to avoid rewriting the AOF file even if the percentage increase
# is reached but it is still pretty small.
#
# Specify a percentage of zero in order to disable the automatic AOF
# rewrite feature.

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

#将此基本大小与当前大小进行比较。如果当前大小为

#大于指定的百分比时,将触发重写。而且

#您需要为要重写的AOF文件指定最小大小,这是

#有助于避免重写AOF文件,即使百分比增加

#已到达,但仍然很小。

#指定零的百分比以禁用自动AOF

3.Redis事务

开启事务:

mulit

提交事务

exec

放弃事务

discard
  • 悲观锁:每次拿数据的时候就会上锁,别人想拿数据,就会被锁住,直到另外一方释放锁。在传统的关系型数据库中用到了很多的悲观锁

  • 乐观锁:

Redis与idea

所需依赖

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>4.2.3</version>
        </dependency>

连接Redis的条件:

  • 开启Redis服务
  • 开放端口号
  • 开启Redis远程连接配置文件

Redis的连接池

 JedisPool jedisPool;
    Jedis jedis;
    @Before
    public void bef(){
        JedisPoolConfig config=new JedisPoolConfig();
        config.setMaxIdle(10);// 最大连接数
        config.setMinIdle(5); // 最小连接数
        config.setMaxWaitMillis(3000);//最大等待时间
        config.setMaxTotal(50);// 最多连接
        jedisPool = new JedisPool(config,"192.168.182.130", 7000);
    }

    @Test
    public void sd() {
        jedis = jedisPool.getResource();
            System.out.println(jedis.keys("*e*"));
            jedis.close();
    }
    @After
    public void setJedisPool(){
        jedis.close();
        jedisPool.close();
    }

数据删除与淘汰策略

Redis中数据的特征

Redis是一种内存级的数据库,所有数据都是内存中的,内存中的数据可以通过ttl获取器状态。

TTL返回值的三种情况:

  • 正数:代表该数据在内存中还能存活的时间
  • -1:永久有效的数据
  • -2:已经过期的数据或被删除的数据或未定义的数据

问题

删除策略就是针对已过期的处理策略,已过期的数据是不是真的就立即删除了?

  • 不是,有很多种删除策略

时效性数据的存储

所有的过期数据都会存放在一块独立的存储空间,Hash结构,key就是内存地址,value是过期时间,保存了使用的key的过期描述,在最终进行过期处理的时候,对该空间的数据进行检测。

数据删除策略

目标:在内存占用和CPU占用之间寻找一种平衡,顾此失彼都会造成redis性能的下降,甚至引发服务器的宕机或内存泄漏。

  1. 定时删除
  2. 惰性删除
  3. 定期删除

定时删除

创建一个定时器,当key设置了过期时间,且过期时间到达时,由定时器任务来立即执行对键的删除操作。

  • 优点:节约内存,到时间就删除,快速释放不必要的内存占用

  • 缺点:CPU压力很大,无论这个CPU此时负载量有多高,都会强制占用CPU,会影响redis的响应时间。

  • 总结:用CPU性能换取存储空间

惰性删除

数据到达过期时间,不做处理。等下次访问该数据时,进行判断:

  • 如果过期了,删除,返回不存在。
  • 如果没过期,返回数据。

优缺点

  • 优点:节约CPU性能,必须删除时才删除。
  • 缺点:内存压力很大,出现长期占用内存的资源。
  • 总结:用存储空间换取CPU性能

定期删除

其实是上两种策略的折中的方案:

  • Redis启动服务器初始化的时候,读取一个配置,server.hz。默认是10。
  • 每秒中实行一次配置。
posted @ 2022-10-10 18:10  (≧∇≦)(≧∇≦)(≧∇≦)  阅读(37)  评论(0)    收藏  举报