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性能的下降,甚至引发服务器的宕机或内存泄漏。
- 定时删除
- 惰性删除
- 定期删除
定时删除
创建一个定时器,当key设置了过期时间,且过期时间到达时,由定时器任务来立即执行对键的删除操作。
-
优点:节约内存,到时间就删除,快速释放不必要的内存占用
-
缺点:CPU压力很大,无论这个CPU此时负载量有多高,都会强制占用CPU,会影响redis的响应时间。
-
总结:用CPU性能换取存储空间
惰性删除
数据到达过期时间,不做处理。等下次访问该数据时,进行判断:
- 如果过期了,删除,返回不存在。
- 如果没过期,返回数据。
优缺点
- 优点:节约CPU性能,必须删除时才删除。
- 缺点:内存压力很大,出现长期占用内存的资源。
- 总结:用存储空间换取CPU性能
定期删除
其实是上两种策略的折中的方案:
- Redis启动服务器初始化的时候,读取一个配置,server.hz。默认是10。
- 每秒中实行一次配置。

浙公网安备 33010602011771号