首页 > 数据库 >Redis基本使用

Redis基本使用

时间:2022-08-30 17:56:55浏览次数:52  
标签:基本 String Redis System key 使用 println redisTemplate out

/**
 * @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

相关文章

  • innobackupex安装、使用、及踩过的坑
    优点:不暂停服务器创建Innodb热备份为mysql做增量的备份在mysql服务器之间做在线表迁移使创建mysqlreplication更加容易备份mysql但不增加服务器的负载 安装:xtraba......
  • 深入浅出promise、await和async以及Generator系列——promise的基本语法和使用
    深入浅出promise、await和async以及Generatorpromise的语法promise的语法是es6比较复杂的一个语法,所以请耐心看完promise是面向对象思想实现的,使用的第一步需要创建一......
  • CMake及交叉工具编译链的安装使用
    1.原理CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的mak......
  • 如何使用Arthas定位问题
    在我们日常的工作中,经常会遇到一些线上才会遇到的问题。Arthas无疑是我们在工作中,定位线上问题的神奇。下面,我将介绍一下我们在工作中经常用到的一些功能。dashboard......
  • ansible工具使用
    1.ansible工具介绍  自动化运维工具,基于python开发,功能主要有批量系统配置、批量程序部署、批量运行命令   官网:https://www.ansible.com/  官方文档:https://do......
  • redis+lua实现令牌桶限流
    github下载直接使用。无任何冗余代码: [email protected]:wangbensen/zhongtai-ext.gitLua脚本--[[1.key-令牌桶的key2.intervalPerTokens-生成令牌的间隔(m......
  • window远程登录linux使用别名的形式
    ssh免密登录远程机器使用别名server#prerequirementssh-keygen-trsassh-copy-id-iid_rsa.pubxxx//~/.ssh/authorized_keys公钥copy到allserver,私钥放......
  • MyBatis常用注解及基本增删改查的注解实现
    MyBatis的常用注解注解可以减少Mapper文件的编写,常用注解如下;@Insert:实现新增@Update:实现更新@Delete:实现删除@Select:实现查询@Result:实现结果集封装@Results:可......
  • 阅读《计算机图形学编程(使用OpenGL和C++)》12 - 光照
    现在最常见的光照模型称为“ADS”模型,因为它们基于标记为A、D和S的3种类型的反射。●环境光反射(Ambientreflection)模拟低级光照,影响场景中的所有物体。●漫反射(Diffuse......
  • cv2简单使用(opencv-python)
    opencv简介:OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和[MacOS](https://baike.baidu.com/item/Mac......