Redis快速入门

1.概念

  • redis作为一款非关系型数据库,相较于mysql这种关系型数据库来说,因为其是基于内存的存储结构,所以拥有更快速的查询和回馈
  • redis是基于键值对(key-value)的形式来存储数据的

2.常用命令

2.1.字符串类型操作命令

  • set key value  设置指定key的值

  • get key  获取键为key的value值

  • 注意:如果先后设置了同一个键的值,那么后设置的值会覆盖前面设置的值
  • setex key seconds value  设置制定key的值并且设置存活时间,单位是秒

  • setnx key value  只有key不存在的时候才能设置上值

首先给city设置上了beijing这个值,那么这个key就存在了,之后再给这个key设置值就不会执行任何操作


2.2.哈希类型操作命令

redis hash是一个string类型的field和value的映射表,特别适合用来存储对象

  • hset key field value  将哈希表key中的字段filed的值设置成value

  • hget key field  获取哈希表key中field的值

  • hdel key field  删除哈希表key中的字段

  • hkeys key  获取哈希表中所有的字段

  • hvals key  获取哈希表key中所有的值

  • hgetall key  获取哈希表key中所有字段和值 


2.3.列表类型操作命令

redis列表是一个简单的字符串列表,按照插入顺序排序,有以下常用指令

  • lpush key value  向指定key中插入一个或者多个值

  • lrange key start stop  获取列表指定范围内的值,下标从0开始,-1就是从头遍历到尾

  • rpop key  移除并获取列表最后一个元素

  • llen key  获取列表长度

  • brpop key1 [key2] timeout  移除队列的最后一个元素,如果没有元素则会阻塞列表直到等待超时或者发现可弹出元素为止


2.4.集合类型&有序集合类型操作命令

redis set是string类型的无序集合,集合成员是唯一的,常用命令如下 


无序集合常用命令 

  • sadd key member1 [member2]   向集合添加一个或者多个元素

  • setmembers key  查询集合所有元素

  • scard key  获取集合中的元素个数

  • sinter key1 key2  返回两个集合的交集

  • sunion key1 key2  返回两个集合的并集

  • sdiff key1 key2  返回两个集合的差集

  • srem key member1 [member2]  移除集合中的一个或者多个元素


有序集合常用命令 

  • redis sorted set 有序集合是String类型元素的集合,且不允许重复的成员出现。
  • 每个元素都会关联一个double类型的分数(score)redis正是通过分数来为集合中的成员进行从小到大的排序的。
  • 有序集合的成员是唯一的,但是分数可以重复

  • zadd key score1 member [score2 member2]  向有序集合添加一个或多个成员,或者更新已存在成员的分数

  • zrange key start stop [withscores]  通过索引区间返回有序集合中指定区间内的成员

  • zincrby key increment member  有序集合中对指定成员的分数加上增量increment

  • zrem key member [member...]  移除有序集合中的一个或者多个成员

2.5.Redis常用命令

  • keys pattern  查找所有符合给定模式(pattern)的key

  • exists key  检查给定key是否存在

  • type key  返回key所存储的值的类型

  • ttl key  返回给定key的剩余生存时间(TTL,time to live),以秒为单位

  • del key  该命令用于在key存在时删除key

 

 3.在Java中操作redis

在Java中,我们一般使用Jedis技术来操作redis数据库,怎么使用Jedis呢?

3.1.导入依赖

导入Jedis的依赖,如下: 

<dependency>
   <groupId>redis.clients</groupId>
   <artifactId>jedis</artifactId>
   <version>2.8.0</version>
</dependency>

导入依赖之后,分一下步骤

  • 获取连接
  • 执行操作
  • 关闭连接
  @Test
    public void test(){
        //获取连接
        Jedis jedis = new Jedis("localhost",6379);

        //执行具体操作
        jedis.set("username","xiaoming");
        System.out.println(jedis.get("username"));

        jedis.hset("001","adr","beijing");
        System.out.println(jedis.hget("001","adr"));

        Set<String> keys = jedis.keys("*");
        String string = keys.toString();
        System.out.println(string);
        //关闭连接
        jedis.close();
    } 

可以看到,具体操作部分的方法和上面讲的基本操作命令一致

 4.使用spring data redis操作redis

在springboot项目中,我们一般使用spring data redis技术来操作redis数据库

4.1.导入依赖

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

spring data redis中提供了一个高度封装的类:redisTemplate,针对jedis客户端中大量的api进行了归类封装,将同一类操作封装为operation接口,具体分类如下:

  • ValueOperations:  简单的k-v操作
  • SetOperations:  set类型数据操作
  • ZSetOperations:  zset类型数据操作
  • HashOperations:  针对map类型的数据操作
  • ListOperations:  针对list类型的数据操作  

在使用这些接口时,要先向spring容器中注入RedisTemplate这个类,但是这个类,因为使用的序列化方法会把key和value转化成不易于我们查看的形式,所以一般使用StringRedis-Template这个类

@Autowired
private StringRedisTemplate stringRedisTemplate;

但是这个StringRedisTemplate类只能要求k-v数据类型是String,所以还有一个方法,就是修改RedisTemplate这个类的配置,在这个配置类中更改序列化方法,即可,如下: 

public class RedisConfig extends CachingConfigurerSupport {

    @Bean
    public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory connectionFactory){
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        //默认的Key的序列化器为:JdkSerializationRedisSerializer
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setConnectionFactory(connectionFactory);
        return redisTemplate;
    }
}

下面就展示下每个类型的常用方法,在使用这个类时,得先注入进来,如下(这里举的例子我用的还是StringRedisTemplate类):

@Autowired
private StringRedisTemplate stringRedisTemplate;

注意:在使用redis前,得先开启redis的服务才行 

    /**
     * 普通k-v类型
     */
    @Test
    void contextLoads() {
        ValueOperations valueOperations = redisTemplate.opsForValue();
        valueOperations.set("province","shanxi");

        ValueOperations<String, String> stringStringValueOperations = stringRedisTemplate.opsForValue();
        stringStringValueOperations.set("XAUAT","xinkong");

        System.out.println(valueOperations.get("province"));
    }
    /**
     * 操作Hash类型的数据
     */
    @Test
    void testHash(){
        HashOperations<String, Object, Object> hashOperations = stringRedisTemplate.opsForHash();
        //存值
        hashOperations.put("China","province","shanxi");
        hashOperations.put("China","college","xauat");

        //取值
        System.out.println(hashOperations.get("China", "province"));
        System.out.println(hashOperations.get("China", "college"));
        System.out.println("--------------------------------------------");
        //获取hash结构中的所有字段
        Set<Object> keys = hashOperations.keys("China");
        for (Object key:keys) {
            System.out.println(key);
        }

        System.out.println("--------------------------------------------");
        //获取hash结构中的所有值
        List<Object> lists = hashOperations.values("China");
        for (Object list:lists) {
            System.out.println(list);
        }
    }
    /**
     * 操作list类型的数据
     */
    @Test
     void testList(){
        ListOperations<String, String> listOperations = stringRedisTemplate.opsForList();

        //存值
        listOperations.leftPushAll("myList","a","b","c","d");

        //取值
        List<String> myList = listOperations.range("myList", 0, -1);
        for (String value : myList) {
            System.out.println(value);
        }
        System.out.println("-----------------------------------------------------------");
        //获取列表的长度
        Long size = listOperations.size("myList");
        int value = size.intValue();
        for (int i = 0; i < value; i++) {
            //出队列
            String element = listOperations.rightPop("myList");
            System.out.println(element);
        }
    }
    /**
     * 操作set集合类型的数据
     */
    @Test
    void testSet(){
        SetOperations<String, String> setOperations = stringRedisTemplate.opsForSet();

        //存值
        setOperations.add("mySet04","a","b","c","d");
        //取值
        Set<String> mySet04 = setOperations.members("mySet04");
        for (String s : mySet04) {
            System.out.println(s);
        }
    }
    /**
     * 操作Zset类型的数据
     */
    @Test
    void testZSet(){
        ZSetOperations<String, String> zSetOperations = stringRedisTemplate.opsForZSet();
        //存值
        zSetOperations.add("myZSet","a",10.0);
        zSetOperations.add("myZSet","b",11.0);
        zSetOperations.add("myZSet","c",12.0);
        zSetOperations.add("myZSet","a",13.0);

        //取值
        Set<String> myZSet = zSetOperations.range("myZSet", 0, -1);
        for (String s : myZSet) {
            System.out.println(s);
        }
        //修改分数
        zSetOperations.incrementScore("myZSet","a",5.0);
        //删除成员
        zSetOperations.remove("myZSet","c");
    }
    /**
     * 通用操作
     */
    @Test
    void testCommon(){

        //获取redis中所有的key
        Set<String> keys = stringRedisTemplate.keys("*");
        for (String key : keys) {
            System.out.println(key);
        }

        //判断某个key是否存在
        Boolean myZSet = stringRedisTemplate.hasKey("myZSet");
        System.out.println(myZSet);

        //删除指定的key
        //stringRedisTemplate.delete("myZSet");

        //获取指定key对应的value的数据类型
        DataType type = stringRedisTemplate.type("myZSet");
        System.out.println(type.name());
    }

  • 27
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值