Redis笔记

REDIS
1.NOSQL是什么?
NoSQL( Not Only SQL ),意即不仅仅是SQL, 泛指非关系型的数据库

2.NOSQL的四大分类
1)键值存储数据库
Redis 基于内存的 运行软件--->磁盘--->内存中
SSDB 基于磁盘的 直接与磁盘做交互--> IO
2)列存储数据库Hbase
键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。列簇
rowkey
3)文档型数据库
4)图形型数据库

3.NOSQL使用场景
数据模型比较简单
需要灵活性更强的IT系统
对数据库性能要求较高
不需要高度的数据一致性(NoSql数据库对事务的支持都不是太好)

4.Redis是什么?
Redis 开源 遵循BSD基于内存数据存储被用于作为数据库缓存消息中间件
总结: redis是一个内存型的数据库

5.Redis特点
Redis是一个高性能key/value内存型数据库 在redis中,所有的数据形式都是以键值对的方式来存储的
Redis支持丰富的数据类型 string,list,set,sorted set 指的是键值对中的值的类型
Redis支持持久化 持久化:将数据落盘,明天会详细说一说redis中的持久化
Redis单线程,单进程 由于是单线程和单进程的,所以它的线程是安全的,我们之前说的java中的多线程安全在分布式中不起作用,当时只针对一个JVM中是有效的。

6.Redis在Linux中使用
1)首先在官网下载版本压缩包
2)接着在Linux中将压缩包通过xftp进行导入到目标目录中
3)在目标目录进行解压 tar -zxvf redis-7.0.10.tar.gz
4)因为Redis是由C语言编写的,所以要通过GCC进行编译,首先下载gcc
下载命令是yum -y install gcc
5)下载过后,进行下载tcl,yum -y install tcl
6)然后在Makefile文件下进行命令操作:make MALLOC=libc
7)完成后通过make install PREFIX=/usr/local/soft/redis,将安装文件存入、usr/local/soft/redis中
8)接着将进入Redis目录的bin下,如果有redis.conf文件的话,将其复制一份到其他目录底下,返回上一级目录
9)通过redis-sever 启动服务
10)通过redis -cli -h localhost -p 6379 (redis-cli) 进入redis
11)如果想在复制的redis.conf文件进入redis的话,可以使用redis-server ./redis.conf进入服务,然后通过redis-cli -h localhost -p 修改后的端口号进行将进入服务
12)至此,redis服务就可以正常使用了!!!

7.进入redis中,里面默认是分为16个库,从0到15进行编号,进行库切换,要是用select 库编号;
库与库之间的数据是相对隔离的,不同的库可以定义不同的键;
.Redis中清空库的指令
清空当前的库 FLUSHDB
清空全部的库 FLUSHALL
.redis客户端显示中文
./redis-cli -p 7000 --raw

8.操作key相关命令
1)删除 del key [key ...] 删除一个或者多个值
2)EXSITS key 检查给定的key是否存在
3)EXPIRE key seconds 只能对已经存在的key设置过期时间
4)keys * 查找所有符合给定模式Patters 的key
5)MOVE patters 将当前数据库中的key移动到给定的数据库中
6)PEXPIRE key milliseconds 为当前的key设置过期时间(毫秒级别)
7)PEXPIREAT key milliseconds-timestamp 设置时间戳
8)TTL key 以秒为单位,给定key返回剩余生存时间
9)PTTL key 以毫秒返回剩余生存时间
10)randomkey 从当前数据库中随机返回一个key
11)rename key newkey 将key的名字改名为newkey
12)type key 返回key所存储的值的存储

9.string类型
set 设置一个key/value
get 根据key获得对应的value
mset 一次设置多个keyvalue
mget 一次获得多个key的value
getset 获得原始key的值,同时设置新值
strlen 获得对应key存储value的长度
append 为对应key的value追加内容
getrange 索引0开始截取value的内容到末尾-1
setex 设置一个key存活的有效期(秒)
psetex 设置一个key存活的有效期(毫秒)
setnx 存在不做任何操作,不存在添加
msetnx原子操作(只要有一个存在不做任何操作)可以同时设置多个key,只有有一个存在都不保存
decr 进行数值类型的-1操作
decrby 根据提供的数据进行减法操作
Incr 进行数值类型的+1操作
incrby 根据提供的数据进行加法操作
I ncrbyfloat 根据提供的数据加入浮点数(不是四舍五入)

10.List类型(相当于数据结构中的堆栈)
list列表相当于Java中的list集合,特点元素有序且可以重复,key还是一个字符串,值是一个list
lpush 将某个值加入到一个key列表头部, 当列表不存在的时候会进行创建
lpushx 同lpush,但是必须要保证这个key存在 必须在列表进行存在的情况下从左插入
rpush 将某个值加入到一个key列表末尾
rpushx 同rpush,但是必须要保证这个key存在
lpop 返回和移除列表左边的第一个元素
rpop 返回和移除列表右边的第一个元素
lrange 获取某一个下标区间内的元素 lrange list 0 -1
llen 获取列表元素个数
lset 设置某一个指定索引的值(索引必须存在)
lindex 获取某一个指定索引位置的元素
lrem 删除重复元素
ltrim 保留列表中特定区间内的元素
linsert 在某一个元素之前,之后插入新元素

11.Set类型
set类型特点:元素无序,不可以重复
sadd 为集合添加元素
smembers 显示集合中所有元素 无序
scard 返回集合中元素的个数
spop 随机返回一个元素 并将元素在集合中删除
smove 从一个集合中向另一个集合移动元素 必须是同一种类型
srem 从集合中删除一个元素
sismember 判断一个集合中是否含有这个元素
srandmember 随机返回元素 后面可以加数字 表示每次返回的个数
sdiff 去掉第一个集合中其它集合含有的相同元素
sinter 求交集
sunion 求和集

12.Zset类型
特点:可排列的set集合,排序,不可重复
zadd 添加一个有序集合元素 zadd zset 2 xiaohu 3 xiaohu2
zcard 返回集合的元素个数
zrange 升序
zrevrange 降序返回一个范围内的元素 如果想看看分数 withscores
zrangebyscore 按照分数查找一个范围内的元素 zrangebyscore zset 0 20 withscores limit 0 2zrank返回排名
zrevrank 倒序排名
zscore 显示某一个元素的分数
zrem 移除某一个元素
zincrby 给某个特定元素加分

13.hash类型
特点: value 是一个map结构 存在key value key 无序的
redis key(String) value(map)
Map<String,Map<String,value>> map

hset 设置一个key/value对
hget 获得一个key对应的value
hgetall 获得所有的key/value对
hdel 删除某一个key/value对
hexists 判断一个key是否存在
hkeys 获得所有的key
hvals 获得所有的value
hmset 设置多个key/value
hmget 获得多个key的value
hsetnx 设置一个不存在的key的值
hincrby 为value进行加法运算(只能针对数值做运行)
hincrbyfloat 为value加入浮点值

14位图:位图不是真正的数据结构类型,它是定义在字符串类型中,一个字符串类型的值最多能存储512M字节的内容
位上限:2(9(512)+10(1024)+10(1024)+3(8b=1B))=232b
一个字节是8位
setbit 设置某一位上的值
sitbit key offset value(offset是偏移量,从0开始)
get key 获取键所对应的值(这里get的值是以二进制转十进制进行通过ASCII码岁对应的进行输出,如果是两个字节,那么是进行拼接的两个ASCII码)
注:如果offset设置偏移量超过一个字节8位的话,它会自动补充一个字节,也是8位
gitbit 获取某一位上的值
gitbit key offset
bitpos 返回指定值0或者1在指定区间的首次出现的下标
bitpos key bit [start] [end]
bitpos key bit 不指定查找范围,表示从全部内容进行查找
bitpos key bit [start]
bitpos key bit [start] [end]
bitop 位查找
bitop operation destkey key [key...]
对一个或多个保存二进制位的字符串 key 进行位操作,并将结果保存到 destkey 上。operation 可以是 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种
BITOP AND destkey key [key ...] ,对一个或多个 key 求逻与,并将结果保存到 destkey(全1为1,不全为0)
BITOP OR destkey key [key ...] ,对一个或多个 key 求逻辑或,并将结果保存到 destkey(全0为0.不全为1)
BITOP XOR destkey key [key ...] ,对一个或多个 key 求逻辑异或,并将结果保存到 destkey(不用为0,相同为1)
BITOP NOT destkey key ,对给定 key 求逻辑非,并将结果保存到 destkey
bitcount 统计指定位区间上值为1的个数
1. BITCOUNT key [start] [end] start end 字节的索引 正方向
从左向右从0开始,注意官方start、end是位,测试后是字节 (这里的start和end是字节!!!)

15.持久化机制
持久化机制有两种:
快照(snapshot)
AOF(APPEND only file) 只追加日志文件

1)持久化机制---快照(snapshot)(官方说法叫快照持久化)
特点:这种方式可以将某一时刻的所有数据都写入硬盘中,当然这也是redis的默认开启持久化方式,保存的文件是以.rdb形式结尾的文件因此这种方式也称之为RDB方式。

快照生成方式:
客户端方式:BGSAVE 和 SAVE
服务器配置自动触发
1) 1.客户端方式之BGSAVE a.客户端可以使用BGSAVE命令来创建一个快照,当接收到客户端的BGSAVE命令时,redis会调用fork来创建一个子进程,然后子进程负责将快照写入磁盘中,而父进程则继续处理命令请求。
名词解释: fork当一个进程创建子进程的时候,底层的操作系统会创建该进程的一个副本,在类似于unix系统中创建子进程的操作会进行优化:在刚开始的时候,父子进程共享相同内存,直到父进程或子进程对内存进行了写之后,对被写入的内存的共享才会结束服务`

2)2.客户端方式之SAVE
b.客户端还可以使用SAVE命令来创建一个快照,接收到SAVE命令的redis服务器在快照创建完毕之前将不再响应任何其他的命令(不会生成新的PID进行当前指令的工作,在此期间服务器不会响应任何其他命令)

!!SAVE命令并不常用,使用SAVE命令在快照创建完毕之前,redis处于阻塞状态,无法对外服务

3)3.服务器配置方式之满足配置自动触发
如果用户在redis.conf中设置了save配置选项,redis会在save选项条件满足之后自动触发一次BGSAVE命令,如果设置多个save配置选项,当任意一个save配置选项条件满足,redis也会触发一次BGSAVE命令。

4)4.服务器接收客户端shutdown指令 当redis通过shutdown指令接收到关闭服务器的请求时,会执行一个save命令,阻塞所有的客户端,不再执行客户端执行发送的任何命令,并且在save命令执行完毕之后关闭服务器

配置生成快照名称和位置
#1.修改生成快照名称
- dbfilename dump.rdb

2.修改生成位置

- dir ./

2)AOF只追加日志文件
1)特点; 这种方式可以将所有客户端执行的写命令记录到日志文件中,AOF持久化会将被执行的写命令写到AOF的文件末尾,以此来记录数据发生的变化,因此只要redis从头到尾执行一次AOF文件所包含的所有写命令,就可以恢复AOF文件的记录的数据集.

2)开启AOF持久化
在Redis中默认的AOF持久化时没有开启的,需要在配置中开启
1.开启AOF持久化
- a.修改 appendonly yes 开启持久化
- b.修改 appendfilename "appendonly.aof" 指定生成文件名称

3)日志追加频率
有三种:always:每个redis都要写入磁盘,会严重损耗redis的速度,如果出现问题的话,数据的丢失会最少,但是redis的速度会受到磁盘性能的限制(使用SS D用户请谨慎使用always选项,这种模式不断写入少量数据的做法有可能会引发严重的写入放大问题,导致将固态硬盘的寿命从原来的几年降低为几个月)
everysec:每秒执行一次同步显示的将多个写命令同步到磁盘;为了兼顾数据安全和写入性能,用户可以考虑使用everysec选项,让redis每秒一次的频率对AOF文件进行同步;redis每秒同步一次AOF文件时性能和不使用任何持久化特性时的性能相差无几,而通过每秒同步一次AOF文件,redis可以保证,即使系统崩溃,用户最多丢失一秒之内产生的数据。

no:由操作系统决定何时同步,如果操作系统现在处理其他的进程,那么等进程处理完才会同步,这样的同步频率太随机了,虽然不会对redis造成影响,但是对于突发状况,数据有可能会大量丢失,另外如果用户硬盘处理写入操作不够快的话,当缓冲区被等待写入硬盘数据填满时,redis会处于阻塞状态,并导致redis的处理命令请求的速度变慢。

4)修改同步频率
1.修改日志同步频率
- 修改appendfsync everysec|always|no 指定

16.AOF重写机制:在一定程度上减少AOF的文件体积,并且还能保证数据不丢失
1)触发重写方式
1)客户端方式触发重写
执行BGREWIRTEAOF 命令,不会阻塞redis的服务:(后台重写AOF的服务)

2)服务器配置方式自动触发
配置redis.conf中的auto-aof-rewrite-percentage选项 参加下图↓↓↓
- 如果设置auto-aof-rewrite-percentage值为100和auto-aof-rewrite-min-size 64mb,并且启用的AOF持久化时,那么当AOF文件体积大于64M,并且AOF文件的体积比上一次重写之后体积大了至少一倍(100%)时,会自动触发,如果重写过于频繁,用户可以考虑将auto-aof-rewrite-percentage设置为更大
2)重写原理
从 Redis 7.0.0 开始,Redis 使用了多部分 AOF 机制。也就是将原来的单个AOF文件拆分为基础文件(最多一个)和增量文件(可能不止一个)。基本文件表示重写 时存在的数据的初始(RDB 或 AOF格式)快照。增量文件包含自创建最后一个基本 AOF 文件以来的增量更改。所有这些文件都放在一个单独的目录中,并由清单文件跟踪。

从 Redis 7.0.0 开始,在调度 AOF 重写时,Redis 父进程会打开一个新的增量 AOF 文件继续写入。子进程执行重写逻辑并生成新的基础 AOF。Redis 将使用一个临时清单文件来跟踪新生成的基础文件和增量文件。当它们准备好后,Redis 会执行原子替换操作,使这个临时清单文件生效。为了避免在 AOF 重写重复失败和重试的情况下创建大量增量文件的问题,Redis 引入了 AOF 重写限制机制,以确保失败的 AOF 重写以越来越慢的速度重试。

17.日志重写:重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,替换原有的文件这点和快照有点类似
1)重写流程
- 1. redis调用fork ,现在有父子两个进程 子进程根据内存中的数据库快照,往临时文件中写入重建数据库状态的命令
- 2. 父进程继续处理client请求,除了把写命令写入到原来的aof文件中。同时把收到的写命令缓存起来。这样就能保证如果子进程重写失败的话并不会出问题。
- 3. 当子进程把快照内容写入已命令方式写到临时文件中后,子进程发信号通知父进程。然后父进程把缓存的写命令也写入到临时文件。
- 4. 现在父进程可以使用临时文件替换老的aof文件,并重命名,后面收到的写命令也开始往新的aof文件中追加。

18.持久化机制总结
两种持久化方案既可以同时使用(AOF),又可以单独使用,在某种情况下也可以都不使用,具体使用那种持久化方案取决于用户的数据和应用决定。

无论使用AOF还是快照机制持久化,将数据持久化到硬盘都是有必要的,除了持久化外,用户还应该对持久化的文件进行备份(最好备份在多个不同地方)。(不要备份在本台机器上)

19.Java操作redis
1.环境配置(maven环境下)
1)引入依赖


redis.clients
jedis
4.3.2

2)创建jedis对象
public static void main(String[] args) {
//1.创建jedis对象
Jedis jedis = new Jedis("192.168.40.110", 7000);//1.redis服务必须关闭防火墙 2.redis服务必须开启远程连接
jedis.select(0);//选择操作的库默认0号库
//2.执行相关操作
//....
//3.释放资源
jedis.close();
}
注:里面的相关方法和Linux里面的redis的api一模一样

posted @ 2022-08-31 21:28  996开发  阅读(50)  评论(0)    收藏  举报