/**
* @Author: KongXiao
* @Date: 2022/8/30-14:01
* @Description:
* www.redis.net.cn 中文网站
* Redis 字符串类型
* SET key value
* GET key get key,key不存在时,返回 nil 类似于 Java的 null,空、不存在
* SETEX key seconds value 比如手机验证码,xxx内有效 key的过期时间是 seconds 秒.注意是 秒.
* SETNX key value 只有在 key不存在时设置 key 的值,分布式锁.
*
* --------------------------------------------------------------------------------------------------------------------
*
* Redis hash 是一个 string类型的 field 和 value 的映射表,hash适合用于存储对象
* HSET key field value
* HGET key field hget不存在的,返回为 nil
* HDEL key field
* HKEYS key
* HVALS key
* HGETALL key
*
* value
* key --------> field1 value1
* field2 value2
*
* --------------------------------------------------------------------------------------------------------------------
*
* Redis列表是简单的字符串列表,按照插入顺序排序
* LPUSH key value1 [value2] 将一个/多个值插入到列表头部
* LRANGE key start stop 查询
* RPOP key 移除并获取列表最后一个元素
* LLEN key 列表长度
* BRPOP key1 [key] timeout 移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
*
* 常用于做任务队列, 可重复
*
* --------------------------------------------------------------------------------------------------------------------
*
* Redis 集合 set,string类型的无序集合,是唯一的
* SADD key member1 [member2] 添加一个/多个成员
* SMEMBERS key 返回集合值所有的成员
* SCARD key 获取集合的成员数
* SINTER key1 [key2] 返回给定所有集合的交集
* SUNION key1 [key2] 返回给定所有集合的并集
* SDIFF key1 [key2] 返回给定所有集合的差集 看好是谁减谁.
* SERM key member1 [member2] 移除集合中一个或多个成员
*
* --------------------------------------------------------------------------------------------------------------------
*
* sorted set 有序集合 是 string类型元素的集合,不允许重复的成员,每个元素都会关联一个 double 类型的分数 score. redis通过分数为
* 集合中的成员进行从小到大排序. 成员是唯一的,但是分数可以重复.
*
* ZADD key score1 member1 [score2 member2]
* ZRANGE key start stop [WITHSCORES]
* ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
* ZREM key member [member...]
*
* --------------------------------------------------------------------------------------------------------------------
*
* Redis 通用命令
*
* KEYS pattern
* EXISTS key
* TYPE key
* TTL key TTL time to live, 以秒为单位,key的剩余时间
* DEL key
*
* --------------------------------------------------------------------------------------------------------------------
*
* Java中操作 Redis
* Redis客户端,官方推荐的:
* - Jedis
* - Lettuce
* - Redisson
* Spring框架对 Redis客户端进行了整合,提供了 Spring Data Redis,在 Spring Boot 项目中还提供了对应的 Starter,
* 即 spring-boot-starter-data-redis
*
* --------------------------------------------------------------------------------------------------------------------
* Jedis
* 获取连接
* 执行操作
* 关闭连接
*
* --------------------------------------------------------------------------------------------------------------------
* Spring Data Redis
* 提供了一个高度封装的类: RedisTemplate,针对 jedis 客户端中大量 api 进行了归类封装,将同一类型
* 操作封装为 operation 接口
* ValueOperations 简单 K-V操作
* SetOperations set类型数据操作
* ZSetOperations zset类型数据操作
* HashOperations 针对 map类型的数据操作
* ListOperations 针对 list类型的数据操作
*/
Jedis的基本使用
<!-- 引入maven依赖 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.0</version>
</dependency>
/**
* @Author: KongXiao
* @Date: 2022/8/30-14:01
* @Description:
* Jedis的基本使用
*/
public class Test01 {
public static void main(String[] args) {
}
@Test
public void testRedis() {
// 1、获取连接
Jedis jedis = new Jedis("your ip", port);
jedis.auth("your password");
// 测试是否连通
System.out.println(jedis.ping());
// 2、执行具体操作
jedis.set("username", "xiaoming");
String username = jedis.get("username");
System.out.println(username);
// jedis.del("username");
jedis.hset("myhash", "addr", "bj");
String hvalue = jedis.hget("myhash", "addr");
System.out.println(hvalue);
Set<String> keys = jedis.keys("*");
for (String key : keys) {
System.out.println(key);
}
// 3、关闭连接
jedis.close();
}
}
SpringDataRedis的基本使用
/**
* @Author: KongXiao
* @Date: 2022/8/30-15:54
* @Description:
* SpringDataRedis的基本使用
*/
@SpringBootTest
@RunWith(SpringRunner.class)
public class SpringDataRedisTest {
// @Autowired // 会飘红,但是不影响运行使用
@Resource
private RedisTemplate redisTemplate;
/**
* 操作 string 类型数据
*/
@Test
public void testString(){
// ValueOperations valueOperations = redisTemplate.opsForValue();
// SetOperations setOperations = redisTemplate.opsForSet();
// redisTemplate.opsForValue().set("city", "hangzhou"); // 默认会有一个序列化操作,默认会对 key 进行一个序列化的操作.
// 自定义序列化方式
redisTemplate.opsForValue().set("city123", "hangzhou");
// value 默认也使用了序列化器. 对于 value,一般不用改,程序中 get出来的时候还会反序列化. 相当于到时候还会还原回来. 所以 value就不用改了,就使用默认的序列化器就行了.
String city123 = (String) redisTemplate.opsForValue().get("city123");
System.out.println(city123);
redisTemplate.opsForValue().set("key1", "value1", 10L, TimeUnit.SECONDS);
// setnx
Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("city123", "nanjing");
System.out.println(aBoolean); // false city123已经存在了,所以 false
Boolean aBoolean2 = redisTemplate.opsForValue().setIfAbsent("city1234", "nanjing");
System.out.println(aBoolean); // true
}
/**
* 操作 hash类型数据
*/
@Test
public void testHash(){
// 操作 hash类型的数据
// HashOperations hashOperations = redisTemplate.opsForHash();
HashOperations hashOperations = redisTemplate.opsForHash();
hashOperations.put("002", "name", "xiaoming");
hashOperations.put("002", "age", "20");
hashOperations.put("002", "address", "hz");
String name = (String) hashOperations.get("002", "name");
String age = (String) hashOperations.get("002", "age");
System.out.println(name + ": " + age);
// 获取hash结构中的所有字段
Set keys = hashOperations.keys("002");
for (Object key : keys) {
System.out.println(key);
}
// 获取hash结构中的所有值
List values = hashOperations.values("002");
for (Object value : values) {
System.out.println(value);
}
}
/**
* 操作 list类型的数据
*/
@Test
public void testList(){
ListOperations listOperations = redisTemplate.opsForList();
// 插入顺序排序 可重复
listOperations.leftPush("mylist", "a");
listOperations.leftPushAll("mylist", "b","c","d");
// 取值
// 可以在泛型这里给他强转一下......
List<String> mylist = listOperations.range("mylist", 0, -1); // 取出所有的值
for (String s : mylist) {
System.out.println(s);
}
// 出队列
// Object mylist1 = listOperations.rightPop("mylist");
// 获取列表长度
Long size = listOperations.size("mylist");
int lSize = size.intValue();
for (int i = 0; i < lSize; i++){
String mylist1 = (String) listOperations.rightPop("mylist");
System.out.println(mylist1);
}
}
/**
* 操作 Set类型的数据
* 无序不可重复
*/
@Test
public void testSet(){
SetOperations setOperations = redisTemplate.opsForSet();
setOperations.add("myset", "a", "b", "c", "a");
// 泛型中强转
Set<String> myset = setOperations.members("myset");
for (String s : myset) {
System.out.println(s);
}
setOperations.remove("myset", "a", "b");
System.out.println("====================");
myset = setOperations.members("myset");
for (String s : myset) {
System.out.println(s);
}
}
/**
* zset 有序集合
* 按照分值从小到大排序
*/
@Test
public void testZSet(){
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
zSetOperations.add("myzset", "a", 10.0);
zSetOperations.add("myzset", "b", 12.0);
zSetOperations.add("myzset", "c", 11.0);
zSetOperations.add("myzset", "a", 13.0); // 把第一个 a 覆盖掉了,所以 a 的分值是 13
// 泛型中强转
Set<String> myzset = zSetOperations.range("myzset", 0, -1);
for (String s : myzset) {
System.out.println(s);
}
// 修改分数
zSetOperations.incrementScore("myzset", "b", 20.0);
System.out.println("======分数修改后======");
myzset = zSetOperations.range("myzset", 0, -1);
for (String s : myzset) {
System.out.println(s);
}
// 删除成员
zSetOperations.remove("myzset", "a", "c");
System.out.println("======删除成员后======");
myzset = zSetOperations.range("myzset", 0, -1);
for (String s : myzset) {
System.out.println(s);
}
}
/**
* Redis 中的一些通用的操作
* 针对不同的数据类型都可以操作.
*/
@Test
public void testCommon(){
// 获取 redis 中所有的 key
Set<String> keys = redisTemplate.keys("*");
for (String key : keys) {
System.out.println(key);
}
// 判断某个 key 是否存在
Boolean hello = redisTemplate.hasKey("hello");
System.out.println(hello);
// 删除指定 key
redisTemplate.delete("myzset");
// 获取指定key对应的value的数据类型
DataType dataType = redisTemplate.type("myset");
System.out.println(dataType.name()); // 数据类型的名称.
}
}
补充
SpringDataRedis默认会对 key 和 value 进行一个序列化操作,为了方便观察,一般我们会自定义对 key 的序列化方式,对于 value,因为读取的时候会进行一个反序列化,所以可以不用关注它.
SpringBoot会通过读取spring.factories来完成自动装配
打开这个文件, 可以看到关于redis的自动装配类
进入这个类中
自定义对 Redis 的配置,配置一下对于 key 的序列化方式
/**
* @Author: KongXiao
* @Date: 2022/8/30-16:06
* @Description:
* Redis 配置类
*/
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory factory){
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
// 默认的 key 序列化器为: JdkSerializationRedisSerializer 框架默认提供的.
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(factory);
return redisTemplate; // 那么此时,注入的 redisTemplate 就是我们自己配置的对象了.
}
}
标签:基本,String,Redis,System,key,使用,println,redisTemplate,out
From: https://www.cnblogs.com/gzyup/p/16640212.html