java操作redis: 将string、list、map、自定义的对象保存到redis中

本文详细介绍如何使用Java操作Redis,包括字符串、列表、集合、映射和自定义对象的存储与检索。通过具体代码示例,展示如何连接Redis服务器,执行基本的CRUD操作,以及如何序列化和反序列化自定义对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【redis,1】java操作redis: 将string、list、map、自定义的对象保存到redis中

 

转自:http://www.tuicool.com/articles/U7JNre

/**

*  @param args

*/

public static void main(String[] args) {

 

//连接 redis 服务

Jedis jedis =  new Jedis( "192.168.88.15" ,6379);

 

//密码验证-如果你没有设置 redis 密码可不验证即可使用相关命令

//        jedis.auth(" abcdefg ");

 

//简单的key-value 存储

jedis.set( "redis" ,  "myredis" );

System. out .println(jedis.get( "redis" ));

 

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

//之前已经设定了 redis 对应" myredis ",此句执行便会使 redis 对应" myredisyourredis"

jedis.append( "redis" ,  "yourredis" );   

jedis.append( "content" ,  "rabbit" );

 

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

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

jedis.mset( "name1" , "yangw" , "name2" , "demon" , "name3" , "elena" );

System. out .println(jedis.mget( "name1" , "name2" , "name3" ));

 

//map

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

user.put( "name" ,  "cd" );

user.put( "password" ,  "123456" );

//map存入 redis

jedis.hmset( "user" , user);

// mapkey 个数

System. out .println(String. format ( "len:%d" , jedis.hlen( "user" )));

//map中的所有键值

System. out .println(String. format ( "keys: %s" , jedis.hkeys( "user" ) ));

//map中的所有value

System. out .println(String. format ( "values: %s" , jedis.hvals( "user" ) ));

//取出map中的name字段值

List<String> rsmap = jedis.hmget( "user" ,  "name" , "password" );

System. out .println(rsmap);

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

jedis.hdel( "user" ,  "password" );

System. out .println(jedis.hmget( "user" ,  "name" ,  "password" ));

 

//list

jedis.del( "listDemo" );

System. out .println(jedis.lrange( "listDemo" , 0, -1));

jedis.lpush( "listDemo" ,  "A" );

jedis.lpush( "listDemo" ,  "B" );

jedis.lpush( "listDemo" ,  "C" );

System. out .println(jedis.lrange( "listDemo" , 0, -1));

System. out .println(jedis.lrange( "listDemo" , 0, 1));

 

//set

jedis.sadd( "sname" ,  "wobby" );

jedis.sadd( "sname" ,  "kings" );

jedis.sadd( "sname" ,  "demon" );

System. out .println(String. format ( "set num: %d" , jedis.scard( "sname" )));

System. out .println(String. format ( "all members: %s" , jedis.smembers( "sname" )));

System. out .println(String. format ( "is member: %B" , jedis.sismember( "sname" ,  "wobby" )));

System. out .println(String. format ( "rand member: %s" , jedis.srandmember( "sname" )));

//删除一个对象

jedis.srem( "sname" ,  "demon" );

System. out .println(String. format ( "all members: %s" , jedis.smembers( "sname")));        

}

二、将自定义对象保存到redis中:

1、自定义pojo 实现Serializable 接口:

package  cn.mingyuan.redis;

import  java.io.Serializable;

/**

* 测试用 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  cn.mingyuan.redis;

import  java.io.ByteArrayInputStream;

import  java.io.ByteArrayOutputStream;

import  java.io.IOException;

import  java.io.ObjectInputStream;

import  java.io.ObjectOutputStream;

import  redis.clients.jedis.Jedis;

public   class  Test {

/**

*  @param args

*  @throws IOException

*  @throws ClassNotFoundException

*/

public static void main(String[] args)  throws IOException,

ClassNotFoundException {

//         Jedis redis = new   Jedis ("192.168.88.15");

Jedis redis =  new Jedis( "192.168.88.15" , 6379);

// connect可以不要,因为在执行set操作的时候会先进行判断客户端是否于服务器端建立了连接,若无,则启动连接过程

redis.connect();

String set = redis.set( "mingyuan" ,  "1" );

System. out .println( " set result \t" + set);

redis.incr( "mingyuan" );

String string = redis.get( "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);

oos.writeObject(person);

byte [] byteArray = bos.toByteArray();

oos.close();

bos.close();

String setObjectRet = redis.set( "mingyuan" .getBytes(), byteArray);

System. out .println( " set object return \t" + setObjectRet);

byte [] bs = redis.get( "mingyuan" .getBytes());

ByteArrayInputStream bis =  new ByteArrayInputStream(bs);

ObjectInputStream inputStream =  new ObjectInputStream(bis);

Person readObject = (Person) inputStream.readObject();

System. out .println( " read object \t" + readObject.toString());

inputStream.close();

bis.close();

redis.disconnect();

}

}

### 使用 Spring Security OAuth2 实现单点登录并储登录信息至 Redis #### 一、项目依赖配置 为了实现基于Spring Security OAuth2的单点登录,并将登录信息Redis,在`pom.xml`文件中需引入必要的依赖: ```xml <dependencies> <!-- Spring Boot Starter Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Spring Boot Starter Data Redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- Spring Boot Starter Security & OAuth2 Client --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-client</artifactId> </dependency> <!-- Spring Boot Starter Security --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <!-- Other dependencies... --> </dependencies> ``` #### 二、安全配置类编写 创建一个名为`SecurityConfig.java`的安全配置类,用于设置OAuth2客户端属性以及指定认证成功的处理器。 ```java @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private CustomOAuth2UserService customOAuth2UserService; @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/", "/login", "/error").permitAll() .anyRequest().authenticated() .and() .oauth2Login(oauth2 -> oauth2.loginPage("/login") .userInfoEndpoint(userInfo -> userInfo.userService(customOAuth2UserService)) .redirectionEndpoint(redir -> redir.baseUri("/login/oauth2/code/*")) .defaultSuccessUrl("/home")); // 开启跨站请求伪造保护,默认开启 http.csrf().disable(); } } ``` 此处通过注入自定义的服务`CustomOAuth2UserService`来处理来自不同提供商的身份验证响应数据[^4]。 #### 三、自定义用户信息服务 构建`CustomOAuth2UserService.java`以扩展默认行为,允许对接收到的信息进一步加工或保存到数据库/缓中。这里我们将展示如何把用户详情对象序列化后放入Redis。 ```java @Service public class CustomOAuth2UserService implements OAuth2UserService<OidcUserRequest, OidcUser> { @Autowired private StringRedisTemplate redisTemplate; public static final String USER_KEY_PREFIX = "user:details:"; @Override public OidcUser loadUser(OidcUserRequest userRequest) throws OAuth2AuthenticationException { OidcUser oidcUser = new DefaultOidcUser(Collections.emptyList(), userRequest.getIdToken()); Map<String, Object> attributes = oidcUser.getAttributes(); // 构建唯一键名 String keyName = USER_KEY_PREFIX + ((String)attributes.get("sub")); // 序列化用户信息并Redis ValueOperations<String, String> opsForValue = redisTemplate.opsForValue(); opsForValue.set(keyName, JSON.toJSONString(attributes)); return oidcUser; } } ``` 上述代码片段展示了当接收到外部身份验证服务器返回的数据时,会将其转换成JSON字符串形式并通过`StringRedisTemplate`工具类写入到Redis实例里去[^3]。 #### 四、读取已储于Redis中的用户资料 最后一步是在适当的地方(比如控制器层),从Redis取出之前保存过的用户记录供业务逻辑调用。 ```java @RestController @RequestMapping("/api/v1/user") public class UserController { @Autowired private StringRedisTemplate redisTemplate; @GetMapping("/{userId}") public ResponseEntity<Map<String,Object>> getUser(@PathVariable String userId){ try{ String userDetailsJsonStr = redisTemplate.opsForValue().get(CustomOAuth2UserService.USER_KEY_PREFIX + userId); if (StringUtils.isEmpty(userDetailsJsonStr)){ throw new ResourceNotFoundException("未找到该ID对应的用户"); } TypeReference<HashMap<String,Object>> typeRef = new TypeReference<HashMap<String,Object>>() {}; HashMap<String,Object> userDetailsMap = JSONObject.parseObject(userDetailsJsonStr,typeRef); return ResponseEntity.ok(userDetailsMap); }catch(Exception e){ log.error(e.getMessage()); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null); } } } ``` 此部分实现了根据传入参数查询对应用户的详细资料的功能,如果找不到匹配项则抛出异常;反之,则正常返回结果给前端显示[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值