【redis基础入门篇】

一,redis的安装配置+图形化工具redis insight

因为安装配置非常简单,所以这里不再赘述,大家可以自行寻找资料下载

二,redis的基本类型及命令(学会使用help+命令查看命令的使用方式)

tips:为了解决id重复的问题,一般采用层级结构存储key>>>项目名:业务名:id

1,通用命令

2,String类型

set key value,写入一个键值对

get key,取出key对应的value

mset key1 value1 key2 value2......,批量写入多个键值对

mget key1 key2....批量取出多个key对应的value

incr key,对整数value自增长(+1)

incrby,对整数value增长并且指定步长

incrbyfloat,对浮点数value增长并且指定步长

setnx,不存在才会添加键值对

setex,添加并且指定有效期

 3,hash类型(单个value中存储了多个键值对的结构)

4,list类型

思考:(1)怎么用list实现栈?(2)怎么实现队列?(3)怎么实现阻塞队列?

其实非常简单,栈保证入口和出口在同一边,队列保证入口和出口在不同的两边,阻塞队列先满足队列的要求,然后再将出口换成BLPOP和BRPOP即可

5,set类型(通常用于好友列表等功能)

  *  不能重复

6, shrtedSet类型

三,redis的Java客户端的使用

1,jedis

(1)简单连接

直接通过创建jedis对象的方式连接redis,这种方式不推荐,因为jedis是线程不安全的

private Jedis jedis;

@BeforeEach
void setUp(){
   jedis = new Jedis("192.168.xxx.xxx",6379);
   jedis.auth("密码...");
   this.jedis.select(1);
}

@AfterEach
void tearDown(){
   if (jedis != null){
      jedis.close();
   }
}

 (2)创建jedis连接池(推荐的jedis连接方式):

public class JedisConnectionFactory {
    // 定义一个JedisPool对象
    private static final JedisPool jedisPool;
    // 静态代码块,初始化JedisPool对象
    static {
        // 创建一个JedisPoolConfig对象
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        // 设置最大连接数
        jedisPoolConfig.setMaxTotal(8);
        // 设置最大空闲连接数
        jedisPoolConfig.setMaxIdle(8);
        // 设置最小空闲连接数
        jedisPoolConfig.setMinIdle(1);
        // 设置最大等待时间
        jedisPoolConfig.setMaxWait(Duration.ofMinutes(2));
        // 创建一个JedisPool对象
        jedisPool = new JedisPool(jedisPoolConfig, "192.168.xxx.xxx",
                6379,1000);
    }
    // 获取Jedis对象
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }
}

2,Sprig Data Redis

(1)引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

(2)注入RedisTemplate

2.1,当我们向redis中存入数据会发现,key和value都出现了乱码,原因是RedisTemplate底层的序列化机制,因为RedisTemplate可以接受object类型的key和value,但是序列化会走默认的序列化机制,这个机制底层是ObjectOutputStream流完成序列化,所以会乱码

if (this.defaultSerializer == null) {
        this.defaultSerializer = new JdkSerializationRedisSerializer(this.classLoader != null ? this.classLoader : this.getClass().getClassLoader());
}
//JdkSerializationRedisSerializer底层
public class DefaultSerializer implements Serializer<Object> {
    public DefaultSerializer() {
    }

    public void serialize(Object object, OutputStream outputStream) throws IOException {
        if (!(object instanceof Serializable)) {
            String var10002 = this.getClass().getSimpleName();
            throw new IllegalArgumentException(var10002 + " requires a Serializable payload but received an object of type [" + object.getClass().getName() + "]");
        } else {
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
            objectOutputStream.writeObject(object);
            objectOutputStream.flush();
        }
    }
}

2.2,通过自定义RedisTemplate解决这个问题,自定义key,hashkey和value,hashvalue的序列化规则同时定义自己需要的key和value泛型

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        //创建RedisTemplate对象
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        //设置连接工厂
        template.setConnectionFactory(redisConnectionFactory);
        //创建JSON序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        //配置序列化规则
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());

        template.setValueSerializer(jsonRedisSerializer);
        template.setHashValueSerializer(jsonRedisSerializer);
        //返回RedisTemplate对象
        return template;
    }
}

(3)调用opsForValue/hash/Set()等等方法

@Test
public void testString() {
   redisTemplate1.opsForValue().set("1", new User("jack",18));
   User user = (User) redisTemplate1.opsForValue().get("1");
   System.out.println(user);
}

此时又引出一个问题,对象user转换为JSON字符串会携带user类的全路径,如果对象传输数量多可能就会占用大量内存

3,使用StringRedisTemplate

通过JSON工具(private static final ObjectMapper mapper = new ObjectMapper();)将对象转为字符,取出时再将字符转换为对象:

String json = mapper.writeValueAsString(user);
redisTemplate.opsForValue().set("1", json);
String string = redisTemplate.opsForValue().get("1");
User value = mapper.readValue(string, User.class);

总结,至此redis的基本用法已经全部学习完毕,接下来进入redis项目的实战篇,同时也希望看到这篇博客的小伙伴能够有所收获,祝大家更进一步。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值