如何使用redis做mysql的缓存

如何使用redis做mysql的缓存,第1张

缓存读取流程:

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原理等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9310224.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存