jedis 怎么获取存储的对象

jedis 怎么获取存储的对象,第1张

安装好redis,进行了基本的 *** 作。包括对map list 和自定义对象的基本 *** 作。笔记都在代码注释里,直接上代码。

private Jedis jedis;

@Before

public void before() {

jedis = new Jedis("127001");

}

/

简单添加

/

@Test

public void test1() {

String name = "name";

String value = "qq";

jedisset(name, value);

Systemoutprintln("追加前:" + jedisget(name)); // 追加前:qq

// 在原有值得基础上添加,如若之前没有该key,则导入该key

jedisappend(name, "ww");

Systemoutprintln("追加后:" + jedisget(name)); // 追加后:qqww

jedisappend("id", "ee");

Systemoutprintln("没此key:" + jedisget(name));

Systemoutprintln("get此key:" + jedisget("id"));

}

/

mset 是设置多个key-value值 参数(key1,value1,key2,value2,,keyn,valuen) mget

是获取多个key所对应的value值 参数(key1,key2,key3,,keyn) 返回的是个list

/

@Test

public void test2() {

jedismset("name1", "aa", "name2", "bb", "name3", "cc");

Systemoutprintln(jedismget("name1", "name2", "name3"));

}

/

map

/

@Test

public void test3() {

Map<String, String> map = new HashMap<String, String>();

mapput("name", "fujianchao");

mapput("password", "123");

mapput("age", "12");

// 存入一个map

jedishmset("user", map);

// map key的个数

Systemoutprintln("map的key的个数" + jedishlen("user"));

// map key

Systemoutprintln("map的key" + jedishkeys("user"));

// map value

Systemoutprintln("map的value" + jedishvals("user"));

// (String key, String fields)返回值是一个list

List<String> list = jedishmget("user", "age", "name");

Systemoutprintln("redis中key的各个 fields值:"

+ jedishmget("user", "age", "name") + listsize());

// 删除map中的某一个键 的值 password

// 当然 (key, fields) 也可以是多个fields

jedishdel("user", "age");

Systemoutprintln("删除后map的key" + jedishkeys("user"));

}

/

list

/

@Test

public void test4() {

jedislpush("list", "aa");

jedislpush("list", "bb");

jedislpush("list", "cc");

Systemoutprintln(jedislrange("list", 0, -1));

Systemoutprintln(jedislrange("list", 0, 1));

Systemoutprintln(jedislpop("list")); // 栈顶

jedisdel("list");

}

/

自定义对象 User为例 id name

RedisTemplate 中有 序列化和反序列化

如:templategetStringSerializer()serialize("name")

/

@Test

public void test5() {

User user = new User();

usersetId(123);

usersetName("fighter");

// 存入一个 user对象

jedisset("user"getBytes(), SerializationUtilserialize(user));

// 获取

byte[] bs = jedisget("user"getBytes());

User desUser = (User) SerializationUtildeserialize(bs);

Systemoutprintln(desUsergetId() + ":" + desUsergetName());

}

对于自定义对象,需要进行序列化和反序列化:我这里提取出了一个工具类,

SerializationUtiljava

/

序列化就是将一个对象转换为二进制的数据流。这样就可以进行传输,或者保存到文件中。如果一个类的对象要想实现序列化,就必须实现serializable接口。在此接口中没有任何的方法,此接口只是作为一个标识,表示本类的对象具备了序列化的能力而已。

反序列化:将二进制数据流转换成相应的对象。

如果想要完成对象的序列化,则还要依靠ObjectOutputStream和ObjectInputStream,前者属于序列化 *** 作,而后者属于反序列化 *** 作。

/

import javaioByteArrayInputStream;

import javaioByteArrayOutputStream;

import javaioObjectInputStream;

import javaioObjectOutputStream;

public class SerializationUtil {

/

序列化

@param object

@return

/

public static byte[] serialize(Object object) {

ObjectOutputStream oos = null;

ByteArrayOutputStream baos = null;

try {

baos = new ByteArrayOutputStream();

oos = new ObjectOutputStream(baos);

ooswriteObject(object);

byte[] bytes = baostoByteArray();

return bytes;

} catch (Exception e) {

}

return null;

}

/

反序列化

@param bytes

@return

/

public static Object deserialize(byte[] bytes) {

ByteArrayInputStream bais = null;

try {

bais = new ByteArrayInputStream(bytes);

ObjectInputStream ois = new ObjectInputStream(bais);

return oisreadObject();

} catch (Exception e) {

}

return null;

}

}

还有都熟悉的User类。我只简单实用id和name,测试,也贴一下吧

public class User implements Serializable {

/

/

private static final long serialVersionUID = -1530813282496676263L;

private Integer id;

private String name;

public Integer getId() {

return id;

}

public void setId(Integer id) {

thisid = id;

}

public String getName() {

return name;

}

public void setName(String name) {

thisname = name;

}

spring-data-redis的RedisTemplate<K, V>模板类在 *** 作redis时默认使用JdkSerializationRedisSerializer来进行序列化,解决方案就是手动把序列化方式设置为StringRedisSerializer;代码如下

private RedisTemplate<String, Object> redisTemplate;

@SuppressWarnings({ "unchecked", "rawtypes" })

@Autowired(required = false)

public void setRedisTemplate(RedisTemplate redisTemplate) {

//spring-data-redis的RedisTemplate<K, V>模板类在 *** 作redis时默认使用JdkSerializationRedisSerializer来进行序列化(key会乱码)

//手动指定键序列化类型使用stringRedisSerializer

RedisSerializer stringSerializer = new StringRedisSerializer();

redisTemplatesetKeySerializer(stringSerializer);

redisTemplatesetValueSerializer(stringSerializer);

redisTemplatesetHashKeySerializer(stringSerializer);

redisTemplatesetHashValueSerializer(stringSerializer);

thisredisTemplate = redisTemplate;

}

一、Redis了解

11、Redis介绍:

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的 *** 作,而且这些 *** 作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改 *** 作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis数据库完全在内存中,使用磁盘仅用于持久性。相比许多键值数据存储,Redis拥有一套较为丰富的数据类型。Redis可以将数据复制到任意数量的从服务器。

12、Redis优点:

(1)异常快速:Redis的速度非常快,每秒能执行约11万集合,每秒约81000+条记录。

(2)支持丰富的数据类型:Redis支持最大多数开发人员已经知道像列表,集合,有序集合,散列数据类型。这使得它非常容易解决各种各样的问题,因为我们知道哪些问题是可以处理通过它的数据类型更好。

(3) *** 作都是原子性:所有Redis *** 作是原子的,这保证了如果两个客户端同时访问的Redis服务器将获得更新后的值。

(4)多功能实用工具:Redis是一个多实用的工具,可以在多个用例如缓存,消息,队列使用(Redis原生支持发布/订阅),任何短暂的数据,应用程序,如Web应用程序会话,网页命中计数等。

13、Redis缺点:

(1)单线程

(2)耗内存

二、64位windows下Redis安装

Redis官方是不支持windows的,但是Microsoft Open Tech group 在 GitHub上开发了一个Win64的版本,下载地址:>

使用场景:当redis某个key过期的时候,我们希望处理一些业务例如发消息或者取消订单等,当然也可以使用中间件mq来实现,之前的文章里有写rocketMq实现消息的通知和消费,这篇文章主要是用redis来实现

我们需要重写onMessage方法,当有key过期的时候这个方法可以获取获取的key,并处理自己的业务

如果我们是多台机器部署,那么我们还需要加锁 *** 作,避免消息的重复消费,这里利用了stringRedisTemplateopsForValue()setIfAbsent命令可以帮我们完成setnx加锁的 *** 作,如果为空set返回true,如果不为空返回false,因为redis是单线程所以可以保证只消费一次,setIfAbsent同时要加上过期时间,注意redis版本过低的话可能没有这个方法

以上就是关于jedis 怎么获取存储的对象全部的内容,包括:jedis 怎么获取存储的对象、spring+jedis保存数据到redis的key乱码问题、windows环境下Redis+Spring缓存实例等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/web/9738653.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存