缓存读取流程:
1、先到缓存中查数据
2、缓存中不存在则到实际数据源中取,取出来后放入缓存
3、下次再来取同样信息时则可直接从缓存中获取
缓存更新流程:
1、更新数据库
2、使缓存过期或失效,这样会促使下次查询数据时在缓存中查不到而重新从数据库去一次。
通用缓存机制:
1、用查询的方法名+参数作为查询时的key value对中的key值
2、向memcache或redis之类的nosql数据库(或者内存hashmap)插入数据
3、取数据时也用方法名+参数作为key向缓存数据源获取信息
/
@param args
/
public static void main(String[] args) {
//连接 redis 服务
Jedis jedis = new Jedis( "1921688815" ,6379);
//密码验证-如果你没有设置 redis 密码可不验证即可使用相关命令
// jedisauth(" abcdefg ");
//简单的key-value 存储
jedisset( "redis" , "myredis" );
System out println(jedisget( "redis" ));
//在原有值得基础上添加,如若之前没有该key,则导入该key
//之前已经设定了 redis 对应" myredis ",此句执行便会使 redis 对应"myredisyourredis "
jedisappend( "redis" , "yourredis" );
jedisappend( "content" , "rabbit" );
// mset 是设置多个key-value值 参数(key1,value1,key2,value2,, keyn , valuen)
// mget 是获取多个key所对应的value值 参数(key1,key2,key3,, keyn ) 返回的是个list
jedismset( "name1" , "yangw" , "name2" , "demon" , "name3" , "elena" );
System out println(jedismget( "name1" , "name2" , "name3" ));
//map
Map<String,String> user = new HashMap<String,String>();
userput( "name" , "cd" );
userput( "password" , "123456" );
//map存入 redis
jedishmset( "user" , user);
// mapkey 个数
System out println(String format ( "len:%d" , jedishlen( "user" )));
//map中的所有键值
System out println(String format ( "keys: %s" , jedishkeys( "user" ) ));
//map中的所有value
System out println(String format ( "values: %s" , jedishvals( "user" ) ));
//取出map中的name字段值
List<String> rsmap = jedishmget( "user" , "name" , "password" );
System out println(rsmap);
//删除map中的某一个键值 password
jedishdel( "user" , "password" );
System out println(jedishmget( "user" , "name" , "password" ));
//list
jedisdel( "listDemo" );
System out println(jedislrange( "listDemo" , 0, -1));
jedislpush( "listDemo" , "A" );
jedislpush( "listDemo" , "B" );
jedislpush( "listDemo" , "C" );
System out println(jedislrange( "listDemo" , 0, -1));
System out println(jedislrange( "listDemo" , 0, 1));
//set
jedissadd( "sname" , "wobby" );
jedissadd( "sname" , "kings" );
jedissadd( "sname" , "demon" );
System out println(String format ( "set num: %d" , jedisscard( "sname" )));
System out println(String format ( "all members: %s" , jedissmembers( "sname")));
System out println(String format ( "is member: %B" , jedissismember( "sname" , "wobby" )));
System out println(String format ( "rand member: %s" , jedissrandmember("sname" )));
//删除一个对象
jedissrem( "sname" , "demon" );
System out println(String format ( "all members: %s" , jedissmembers( "sname")));
}
二、将自定义对象保存到redis中:
1、自定义pojo 实现Serializable 接口:
package cnmingyuanredis;
import javaioSerializable;
/
测试用 pojo ,实现了 Serializable ,以便进行系列化 *** 作
@author mingyuan
/
public class Person implements Serializable {
private static final long serialVersionUID = -3562550857760039655L;
private String name ;
private int age ;
public Person(){}
public Person(String name, int age) {
super ();
this name = name;
this age = age;
}
public String getName() {
return name ;
}
public void setName(String name) {
this name = name;
}
public int getAge() {
return age ;
}
public void setAge( int age) {
this age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]" ;
}
}
2、测试类:
package cnmingyuanredis;
import javaioByteArrayInputStream;
import javaioByteArrayOutputStream;
import javaioIOException;
import javaioObjectInputStream;
import javaioObjectOutputStream;
import redisclientsjedisJedis;
public class Test {
/
@param args
@throws IOException
@throws ClassNotFoundException
/
public static void main(String[] args) throws IOException,
ClassNotFoundException {
// Jedis redis = new Jedis ("1921688815");
Jedis redis = new Jedis( "1921688815" , 6379);
// connect可以不要,因为在执行set *** 作的时候会先进行判断客户端是否于服务器端建立了连接,若无,则启动连接过程
redisconnect();
String set = redisset( "mingyuan" , "1" );
System out println( " set result \t" + set);
redisincr( "mingyuan" );
String string = redisget( "mingyuan" );
System out println( " get result of key 'mingyuan' \t" + string);
// 下面是对对象进行存储的测试代码
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
Person person = new Person( "liudehua" ,22);
ooswriteObject(person);
byte [] byteArray = bostoByteArray();
oosclose();
bosclose();
String setObjectRet = redisset( "mingyuan" getBytes(), byteArray);
System out println( " set object return \t" + setObjectRet);
byte [] bs = redisget( "mingyuan" getBytes());
ByteArrayInputStream bis = new ByteArrayInputStream(bs);
ObjectInputStream inputStream = new ObjectInputStream(bis);
Person readObject = (Person) inputStreamreadObject();
System out println( " read object \t" + readObjecttoString());
inputStreamclose();
bisclose();
redisdisconnect();
}
}
Sorted Set,和set相比,增加权重参数score(浮点数)有序排列。Redis唯一可 根据成员访问 ,又可以 根据分值排序 ,访问元素结构。
场景:在线用户列表,各种礼物排行榜 ,d幕消息(可以理解为 按消息维度的消息排行榜 )等信息,适合使用Redis中的SortedSet结构进行存储。
概要:原理(ziplist,skiplist,例子, *** 作)、 红黑树比较、 score相同,怎么排序
底层ziplist 或 HashMap和跳跃表(SkipList) 有序集合
元素数 <128个 ,所有成员长度 <64字节 。都可通过zset-max-ziplist-entries和zset-max-ziplist-value来修改。
紧凑 压缩 列表节点 来保存,第一个节点存 member ,第二个存score, 按score从小到大排序
底层是 zset(1字典,跳跃表) 和一个。
1) HashMap: 放 成员 到 score映射 O(1) ,共享相同元素member和score,因此不会浪费额外的内存
2) 跳跃表: 放所有成员,依据HashMap的score,查找效率高,链表增加跳跃功能,O(logN)
插入或查找:O(1)获得节点分值,遍历跳跃表,根据分值到合适位置
新链表,包含原来一半,沿新查。 遇大节点,回原查。 7比较,19比较,比26小,回原链),比22要大,23比26小,23不存在
再增加,第三层链表: 查快 。 插/删重新进行调整,退化O(n)。
解决办法: 不要求 上下 相邻 链表间,节点个数 严格对应 ,如,一个节点随机出 层数3 ,那么就把它链入到第1层到第3层这三层链表中。
插入, 不影响 其它节点 层数 。只 修改 插入节点 前后指针 ,降低插入复杂度。 插入性能 明显优于 平衡树
查: 若干层稀疏链表,先查高层, 逐层降低 ,最终降到第1层。跳一些节点,加快速度。实际 按key(score)排序
基本 *** 作
1、 内存: 占更 小 ,更新 更节约、更灵活
2、ZRANGE或ZREVRANGE *** 作,跳表作为链表 遍历 ,和平衡树一样
3、简单: 易于实现,调试。
4、插入/删除,不需调整很多
(1)AVL 树 查询效率 严格 O(logN) ,插入需 多次旋转 ,导致插入 效率较低 ,才有更实用 红黑树 。
(2)红黑树 并发环境不方便, 更新 数据时, Skip更新较少,锁的也少 ,而红黑树有 平衡的过程 (涉及到较多节点), 锁住更多节点,降低并发性 。
(3)SkipList 优势 实现简单 ,红黑树2天,SkipList2个小时实现。
用字典排序,“ABCDEFG”,首字母相同,比较后面的
>
以上就是关于如何使用redis做mysql的缓存全部的内容,包括:如何使用redis做mysql的缓存、java 监听redis map是否有修改、(3)Redis zset原理等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)