文章目录
江南一点雨网站:http://itboyhub.com/
使用虚拟机安装Ubuntu16.04,并编译安装redis成功。
编译安装后,将控制台占住了
修改配置文件,
vi redis.conf
redis-server redis.conf#启动redis
redis-cli -a 123#进入代理区
第二章 基本数据类型
String
List
Set
Hash
ZSet
不止这5个,这五个是基础。
1.String
String是redis中最简单的数据结构。在redis中,所有的key都是字符串。不同的key对应的value具有不同的数据结构,我们所说的五种不同的数据类型,主要是指value的数据类型不同。
redis中的字符串是动态字符串,内部是可以修改的,像StringBuffer,StringBuilder,采用分配荣誉空间的方式减少内存的频繁分配。
在redis内部结构中,一般实际分配的内存会大于需要的内存,当字符串<1M时,都是在现有的空闲基础上加倍。扩容每次扩1M,最大512M。
- append
在
ttl 查看有效期
单位为秒s
2.List
开启Redis,使用Jedis连接
redis的安装路径在根目录下
在Xshell中,
cd redis-6.2.5/
redis-server redis.conf #启动redis
redis-cli -a 123 #即可使用命令行的方法操作redis中的数据了
try-with-resource is not support in language level 5
File->Project Structure->Module->language level调到7以上就可以了。
执行又出现了错误:
Error:java: Compilation failed: internal java compiler error 解决办法:
https://blog.csdn.net/wo541075754/article/details/82119860
我在pom.xml文件中,添加了,就好了。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
try-with-resource
public class MyJedis02 {
public static void main(String[] args) {
//获取一个连接池对象
JedisPool pool = new JedisPool("192.168.68.128",6379);
//从连接池中获取一个个Jedis连接
try(Jedis jedis = pool.getResource()){
jedis.auth("123456");
String ping = jedis.ping("hello");
System.out.println(ping);
}
}
}
lambda语法糖
https://www.cnblogs.com/JonnyJiang-zh/p/13702842.html
public interface interfaceCallWithJedis {
void call(Jedis jedis);
}
分布式锁
setnx key value命令
NX not exists
如果不存在key,则设置value的值
该值不会被覆盖。
public class MyJedis03 {
private JedisPool pool;
public MyJedis03(){
GenericObjectPoolConfig config = new GenericObjectPoolConfig();//连接池最大空闲数
config.setMaxIdle(300);//最大连接数
config.setMaxTotal(1000);
//连接最大等待时间,如果是 -1 表示没有限制
config.setMaxWaitMillis(30000);
// 在空闲时检查有效性
config.setTestOnBorrow(true);
pool = new JedisPool(config, "192.168.68.128", 6379, 30000, "123456");
}
public void execute(interfaceCallWithJedis callwithjedis){
try(Jedis jedis2 = pool.getResource()){
callwithjedis.call(jedis2);
}
}
public static void main(String[] args) {
MyJedis03 redis = new MyJedis03();
redis.execute(jedis04 -> {System.out.println(jedis04.ping());});
}
}
延迟消息队列
使用zset,使用时间作为score,将value存入redis中,通过轮询的方式,不断的读取消息。
如果消息是String类型,直接传输即可,如果是Hash,List,set,zet,需要将对象序列化,之后当作字符串传输。
Bit操作
get/set
getbit
setbit
bitcount key start end,start和end是字符的索引而不是01的索引
bitpos用来统计在指定范围内出现的第一个1或者0的位置,这个命令中的其实和结束位置都是字符索引而不是bit索引,一定要注意。
8.4 Bit批处理
在redis3.2之后新加的功能叫做bitfield,
bitfield name get u4 0
表示获取name中的位,从0开始获取,获取4个位,返回一个无符号数字。
-u表示无符号数字
-i表示有符号数字,有符号的第一个符号就是符号位,1表示是一个负数。
布隆过滤器Bloom Filter
查询到不存在,则一定不存在;查询到存在,可能不存在。用户可能错过某条信息。
相当于一个不太精确的set集合,可利用里面的contains方法判断某个信息是否存在。
bloom过滤器
每一个布隆过滤器,在redis中都对应了一个大型的位数组以及几个不同的hash函数。
b=布隆过滤器和redis并不是绑定的,它的思想可以用于任何地方,用任何语言实现。
缓存击穿
雪崩效应是什么意思?
Redis中的key是一维数组+链表的形式。cursor指的是一维数组的槽的位置,limit则是遍历的一维数组槽位数,所以每次返回的数组大小不确定
SCAN
Redis中字典(Dictionary)的实现:https://blog.csdn.net/belalds/article/details/92806223
Redis中好玩的算法-高位进位法:https://blog.csdn.net/u014439693/article/details/108325632
Redis的淘汰机制LRU
因为Redis是基于内存的,当Redis所使用的内存超过物理内存限制的时候,内存中的数据会和磁盘数据发生频繁的交换,这种交换会降低redis的性能。
Redis淘汰策略
当redis实际内存超过系统可用内存之后,Redis提供几种策略:
1.noeviction:默认的策略,此时写操作将停止,删除和读取可以进行。
2.volatile-lru:淘汰设置了过期时间的key,最近最少使用的key会被淘汰,如果一个key没有设置过期时间,则不会被淘汰。
3.volatile-ttl:淘汰设置了过期时间的key,根据key的ttl值,ttl越小,越优先淘汰,如果一个key没有设置过期时间,则不会被淘汰。
4.volatile-random:淘汰设置了过期时间的key,随意移除设置了过期时间的key,如果一个key没有设置过期时间,则不会被淘汰。
5.allkeys-lru:淘汰所有的key,最近最少使用的key会被淘汰。
6.allkeys-random:淘汰所有的key,随机淘汰。
lazy free
Redis是单线程的,如果直接删除一个很大的key,可能会造成卡顿。
异步删除
命令:unlink key
flushall async 异步删除
flushdb async
6.ssl
加密通信
软件spiped
第五章 深入理解redis
NIO 非阻塞IO
阻塞IO和非阻塞IO的区别:
如果你从数据流中读取不到指定大小的数据流,IO就会阻塞。
Redis是单线程的,单线程如何解决高并发问题的?
实际上,能够处理高并发的线程应用不仅是Redis,除了Redis外,还有NodeJS,Nginx等也是单线程。
Redis虽然也是单线程,但是运行很快,主要有一下几个方面:
1.所有数据都是放在内存的,计算也都是内存级别的计算,比较快。
2.redis是单线程的,所以有一些时间复杂度比较高的指令,比如keys,会出现卡顿。
3.Redis在处理并发的客户端连接时,使用了非阻塞IO。
在使用非阻塞IO时,有一个问题就是线程如何知道剩下的数据来了?
涉及到一个新的概念多路复用,本质就是一个事件轮询API。看
Java NIO
4.Redis会给每一个客户端套接字Socket指定一个指令队列,指令通过队列来排队进行顺序处理。
5.Redis也有一个响应队列,将响应结果通过队列,将指令结果返回给客户端。
Redis
RDB恢复快,保存的数据没有AOF完整,比较适合数据库
watch money
监控money,如果money改变了,那么在事务执行过程中,事务就会执行失败。
Redis分布式系统
CAP
一致性consistency
可用性availability
分布式容忍性Partition tolerance
redis要保证最终一致性。
从机连接主机失败的话,需要配置redis.conf中的masterauth 123456,即配置主机密码。
复制原理
master每向slave发送一条数据之后,偏移量offset就会加一
哨兵模式
sentinel.conf
一个master down了,新推选出的slaver如何变成master
masterauth
bind
Intellij IDEA 2019无法联网,无法下载插件问题解决办法:https://blog.csdn.net/hanxue6898/article/details/96508529
IntelliJ IDEA 开发 Spring 的常用插件
从redis5开始,推出了redis stream