Redis如何存儲(chǔ)對象
Redis存儲(chǔ)對象
在以往面試中,多次被問到Redis怎么存儲(chǔ)對象,我支支吾吾半天回答不上來,畢竟我只用過String類型,為了避免以后的尷尬,今天花點(diǎn)時(shí)間來整理一下。
本人用的Jedis客戶端
首先引入依賴
? ? ? ? <dependency> ? ? ? ? ? ? <groupId>redis.clients</groupId> ? ? ? ? ? ? <artifactId>jedis</artifactId> ? ? ? ? ? ? <version>3.2.0</version> ? ? ? ? </dependency>
創(chuàng)建一個(gè)Jedis實(shí)例
package com.xiateng.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* jedis獲取工具類
*/
public class JedisUtil {
private static JedisPool jedisPool;
private static final Logger logger = LoggerFactory.getLogger(JedisUtil.class);
static {
// 初始化連接池
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(20);
jedisPoolConfig.setMaxIdle(10);
jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379);
logger.info("jedisPool連接池初始化====" + jedisPool);
}
/**
* 獲取一個(gè)Jedis實(shí)例
* @return
*/
public synchronized static Jedis getJedis(){
Jedis jedis = jedisPool.getResource();
// jedis.auth("123456");//密碼
return jedis;
}
}下面我們來實(shí)現(xiàn)存儲(chǔ)對象
方式一:將對象轉(zhuǎn)化為JSON字符串存入redis
Jedis jedis = JedisUtil.getJedis();
TUser tUser = new TUser();
tUser.setUserName("你好");
tUser.setPassword("2342342");
jedis.set("xiateng", JSON.toJSONString(tUser));
?
String sss = jedis.get("xiateng");
TUser ssss = JSON.parseObject(sss,TUser.class);
jedis.del("xiateng");
System.out.println("---------------------------: ?"+ssss.toString());方式二:將對象序列化后存到redis
封裝序列化跟反序列化方法
package com.xiateng.util;
import java.io.*;
public class SerializeUtil {
/**
* 序列化操作
* @param object
* @return
*/
public static byte[] serialize(Object object){
ObjectOutputStream oos = null;
ByteArrayOutputStream baos = null;
try {
// 序列化
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(object);
byte[] bytes = baos.toByteArray();
return bytes;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 反序列化操作
* @param bytes
* @return
*/
public static Object unSerialize(byte[] bytes){
ByteArrayInputStream bais = null;
try {
bais = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
return ois.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}保存對象
Jedis jedis = JedisUtil.getJedis(); ? ? ?
jedis.set("code".getBytes(), SerializeUtil.serialize(tUser));
byte[] bytes = jedis.get("code".getBytes());
TUser o = (TUser)SerializeUtil.unSerialize(bytes);
jedis.del("code");
System.out.println(o.toString());方式三:將對象用Hash數(shù)據(jù)類型存儲(chǔ)
Jedis jedis = JedisUtil.getJedis();
jedis.hset("user", "id", "3");
jedis.hset("user", "name", "xiateng");
jedis.hset("user", "password", "123455");
jedis.hget("user","id");
List<String> user = jedis.hmget("user", new String[]{"id","name","password"});
System.out.println("---------------------------: ?"+user);
?
// 輸出結(jié)果 [3,xiateng,123455]注意:以序列化的方式存儲(chǔ)的對象需要實(shí)現(xiàn) Serializable 接口
Redis可以存儲(chǔ)java對象嗎
答案:是可以
但是你對象必須要序列化。
redis沒有辦法把一個(gè)沒有序列化的對象存儲(chǔ)到redis中。
package com.kuangstudy.entiy;
import lombok.Data;
public class User implements java.io.Serializable{
private Integer id;
private String nickname;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
這樣太麻煩了,并且存儲(chǔ)中文會(huì)有亂碼,那如何解決呢?只能重新定義一個(gè)redisTemplate
package com.kuangstudy.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfiguration {
/**
* @return org.springframework.data.redis.core.RedisTemplate<java.lang.String, java.lang.Object>
* @Author 徐柯
* @Description 改寫redistemplate序列化規(guī)則
* @Date 13:20 2021/5/20
* @Param [redisConnectionFactory]
**/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 創(chuàng)建一個(gè)json的序列化方式
GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
// 設(shè)置value用jackjson進(jìn)行處理
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
// 設(shè)置key用string序列化方式
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot整合Mybatis-plus和Redis實(shí)現(xiàn)投票功能
投票功能是一個(gè)非常常見的Web應(yīng)用場景,這篇文章將為大家介紹一下如何將Redis和Mybatis-plus整合到SpringBoot中,實(shí)現(xiàn)投票功能,感興趣的可以了解一下2023-05-05
Redis?中使用?list,streams,pub/sub?幾種方式實(shí)現(xiàn)消息隊(duì)列的問題
這篇文章主要介紹了Redis?中使用?list,streams,pub/sub?幾種方式實(shí)現(xiàn)消息隊(duì)列,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
Unable?to?connect?to?Redis無法連接到Redis解決的全過程
這篇文章主要給大家介紹了關(guān)于Unable?to?connect?to?Redis無法連接到Redis解決的相關(guān)資料,文中通過圖文以及實(shí)例代碼將解決的過程介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03
一起raid數(shù)據(jù)恢復(fù)及回遷成功的案例
這篇文章主要介紹了一起raid數(shù)據(jù)恢復(fù)及回遷成功的案例,需要的朋友可以參考下2017-04-04
RedisTemplate 實(shí)現(xiàn)基于Value 操作的簡易鎖機(jī)制(示例代碼)
本文將介紹如何使用 RedisTemplate 的 opsForValue().setIfAbsent() 方法來實(shí)現(xiàn)一種簡單的鎖機(jī)制,并提供一個(gè)示例代碼,展示如何在 Java 應(yīng)用中利用這一機(jī)制來保護(hù)共享資源的訪問,感興趣的朋友跟隨小編一起看看吧2024-05-05
百行代碼實(shí)現(xiàn)基于Redis的可靠延遲隊(duì)列
本文主要介紹了百行代碼實(shí)現(xiàn)基于Redis的可靠延遲隊(duì)列,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
redis實(shí)現(xiàn)存儲(chǔ)帖子的點(diǎn)贊狀態(tài)和數(shù)量的示例代碼
使用Redis來實(shí)現(xiàn)點(diǎn)贊功能是一種高效的選擇,因?yàn)镽edis是一個(gè)內(nèi)存數(shù)據(jù)庫,適用于處理高并發(fā)的數(shù)據(jù)操作,這篇文章主要介紹了redis實(shí)現(xiàn)存儲(chǔ)帖子的點(diǎn)贊狀態(tài)和數(shù)量的示例代碼,需要的朋友可以參考下2023-09-09

