
安装好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缓存实例等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)