1.redis数据一致性
redis数据保证一致性:
首先是有四种解决策略:
(1)先更新缓存,再更新数据库;
(2)先更新数据库,再更新缓存;
(3)先删除缓存,再更新数据库;
(4)先更新数据库,再删除缓存.
建议使用:先更新数据库,然后再删除缓存
删除缓存然后更新数据库可能会造成
**a线程先删除缓存,b此时读取缓存失败,去数据库读取,得到旧的数据,b将旧的数据更新到了缓存,进程a此时更新数据库===>使得数据库和缓存最终不一致.**===>这种删除缓存,更新数据库采用延迟双删,保证最后数据的一致性
结论:
**使用先更新数据库,然后删除缓存===>删除缓存可能失败,此时使用rabbitmq重复消费解决
使用先删除缓存,然后更新数据库,可能导致缓存中是旧值,===>使用延迟双删解决**
2.单例模式实现的几种方式
1.饿汉式
public class Singleton {
private static Singleton singleton = new Singleton();
private static Singleton singleton2;
private Singleton(){}
public static Singleton getSingleton(){
return singleton;
}
public static Singleton getInstance1(){
if (singleton2 == null){
synchronized (Singleton.class){
if (singleton2 == null){
singleton2 = new Singleton();
}
}
}
return singleton2;
}
public static void main(String[] args) {
Singleton singleton = Singleton.getSingleton();
Singleton singleton1 = Singleton.getSingleton();
System.out.println(singleton == singleton1);
Singleton instance1 = Singleton.getInstance1();
Singleton instance2 = Singleton.getInstance1();
System.out.println(instance1 == instance2);
}
}
public class Singleton {
private Singleton () {}
public static Singleton getInstance() {
return SingletonInner.instance;
}
private static class SingletonInner {
private static final Singleton instance = new Singleton();
}
}