Redis入门笔记

 一:简介:基于内存的key-value的结构数据库

        1.基于内存存储,读写性能高

        2.适合存储热点数据(热点商品,资讯,新闻)

        3.企业应用广泛

二:Redis与MySQL的对比:

Redis和MySQL是两种不同类型的数据库,各有其适用的场景和优势。

  1. 数据存储方式:

    • Redis:Redis是一种基于内存的键值存储系统,数据存储在内存中,读写速度非常快。它支持多种数据结构,如字符串、哈希表、列表、集合、有序集合等。
    • MySQL:MySQL是一种关系型数据库管理系统(RDBMS),数据以表格的形式组织,使用SQL查询语言进行操作。
  2. 数据持久性:

    • Redis:Redis可以选择将数据持久化到硬盘上,以便在服务重启时恢复数据。它提供了两种持久化方式:RDB(快照)和AOF(日志追加)。
    • MySQL:MySQL默认将数据持久化到硬盘上,通过日志记录增量变更,保证数据的持久性和一致性。
  3. 数据查询:

    • Redis:Redis对于简单的键值查询非常高效,支持根据键进行快速查找。它还提供了一些高级功能,如按范围查询、模糊查询等。
    • MySQL:MySQL是一种关系型数据库,支持复杂的查询操作,可以进行多表连接、聚合查询、排序等。
  4. 数据一致性:

    • Redis:由于Redis是基于内存的数据库,对于高并发的写操作可能存在数据丢失的风险。在默认配置下,Redis是单线程的,可以通过主从复制或集群模式提高可靠性和数据一致性。
    • MySQL:MySQL采用了事务机制,保证了数据的一致性。支持ACID特性(原子性、一致性、隔离性、持久性)。

三:二者的使用场景对比:

  • Redis适用于对读写速度要求较高、数据量较小、对数据结构有特殊需求的场景,如缓存、会话管理、计数器、排行榜等。
  • MySQL适用于需要进行复杂查询、大型数据存储、数据一致性要求较高的场景,如电子商务、社交网络、论坛等。

在实际应用中,也可以将Redis和MySQL结合起来使用,充分发挥它们各自的优势。例如,可以将热门数据缓存到Redis中,减轻MySQL的压力,提高系统的整体性能和响应速度。

四:Redis服务启动:                      

                1.安装包下载地址:https://github.com/microsoftarchive/redis/releases               

                2.下载解压后,在当前目录进入命令行模式(cmd)下,

                3.输入 redis-server.exe redis.windows.conf连接服务

五:Redis客户端连接:

Redis入门笔记_第1张图片

指定连接哪个设备(图中是localhost)的端口(图中是6379)的redis的服务

 六:设置Redis的密码:

        1.打开redis.windows.conf文件并修改以下内容:requirepass xxxx(xxxx就是要修改的密码) 

Redis入门笔记_第2张图片

        2.再次登录在后面用 - a 参数填写密码:

Redis入门笔记_第3张图片

七: Redis的数据类型

        介绍:Redis存储的是key-value结构的数据,其中key是字符串类型,value有5中常用的数据类型(字符串string,哈希hash,列表list,集合set,有序集合sorted set / zset)

        1.字符串string

                普通字符串,Redis中最简单的数据类型

                (存储 Session 信息、存储缓存信息(如详情页的缓存)、 存储整数信息,可使用 incr 实现整数+1,和使用 decr 实现整数 -1;)

        2.哈希hash

                也叫散列,类似于Java中的HashMap结构key-{(field1 value1),(field2 value2)}

                (存储 Session 信息、存储商品的购物车,购物车非常适合 用哈希字典表示,使用人员唯一编号作为字典的 key,value 值可以存储商品的 id 和数量等信息、 存储详情页信息;)

        3.列表list

                按照插入顺序排序,可以由重复元素,类似于Java中的LinketList(简单的字符串列表,按照插入顺序排序)key--->value{a-b-c-d}

                (实现简单的消息队列、存储某项列表数据;)

        4.集合set

                string类型的无序集合,没有重复元素,类似于Java中的HashSet

                (关注功能,比如关注我的人和我关注的人,使用集合存储,可以保证人员不会重复;)

        5.有序集合sorted set / zset

                string类型元素的集合,没有重复元素,每个元素关联一个double类型的分数(score),根据分数升序排序

                (可以用来存储排名信息、关注列表功能,这样就可以根据关注实现排序展示)

 八:Redis的常用命令:(不区分大小写)

        1.字符串操作命令:

                SET key value:设置指定key的值

                GET key:获取指定key的值

                SEREX key seconds value:设置指定key的值,并设置key的过期时间为seconds秒 

                SETNX key value:只有在key不存在时设置key的值

Redis入门笔记_第4张图片

        2.哈希操作命令:

                HSET key field value:将哈希表key中的字段field的值设为value

                HGET key field:获取存储在哈希表中指定字段的值

                HDEL key field:删除存储在哈希表中的指定字段

                HKEYS key:获取哈希表中所有字段

                HVALS key:获取哈希表中所有值

Redis入门笔记_第5张图片

Redis入门笔记_第6张图片

Redis入门笔记_第7张图片Redis入门笔记_第8张图片

        3.列表操作命令:

                LPUSH key value1 [value2]:将一个或多个值插入到列表头部(对应也有从右边插入rpush)

                LRANGE key start stop:获取列表指定范围内的元素(从0开始,-1代表列表尾部)

                RPOP key:移除并获取列表最后一个元素(对应也有移除并获取列表第一个元素lpop)

                LLEN key:获取列表长度

Redis入门笔记_第9张图片

        4.集合操作命令:

                SADD key member1 [member2]:向集合添加一个或多个成员

                SMEMBERS key:返回集合中的所有成员

                SCARD key:获取集合的成员数

                SINTER key1 [key2]:返回给定所有集合的交集

                SUNION key1 [key2]:返回所有给定集合的并集

                SREM key member1 [member2]:删除集合中一个或多个成员        

Redis入门笔记_第10张图片

        5.有序集合操作命令:

                ZADD key score1 member1 [score2 member2]:向有序集合添加一个或多个成员

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

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

                ZREM key member [member ...]:移除有序集合中的一个或多个成员

Redis入门笔记_第11张图片

        6.通用操作命令:

                KEYS pattern:查找所有符合给定模式(pattern)的key

                EXISTS key:检查给定key是否存在

                TYPE key:返回key所储存的值的类型

                DEL key:该命令用于在key存在时删除key

Redis入门笔记_第12张图片

 九:在Java中操作Redis

Redis入门笔记_第13张图片

        9.1Spring Data Redis使用:

Redis入门笔记_第14张图片Redis入门笔记_第15张图片

         9.2单元测试中通过RedisTemplate对象操作Redis的常见类型的数据:

/**
     * 操作字符串类型的数据
     */
    @Test
    public void testString(){
        // set get setex setnx
        redisTemplate.opsForValue().set("city","北京");
        String city = (String) redisTemplate.opsForValue().get("city");
        System.out.println(city);
        redisTemplate.opsForValue().set("code","1234",3, TimeUnit.MINUTES);
        redisTemplate.opsForValue().setIfAbsent("lock","1");
        redisTemplate.opsForValue().setIfAbsent("lock","2");
    }
/**
     * 操作hash类型的数据
     */
    @Test
    public void testHash(){
        //hset hget hdel hkeys hvals
        HashOperations hashOperations = redisTemplate.opsForHash();

        hashOperations.put("100","name","tom");
        hashOperations.put("100","age","20");

        String name = (String) hashOperations.get("100", "name");
        System.out.println(name);

        Set keys = hashOperations.keys("100");
        System.out.println(keys);

        List values = hashOperations.values("100");
        System.out.println(values);

        hashOperations.delete("100","age");

    }
/**
     * 操作列表类型的数据
     */
    @Test
    public void testList(){
        //lpush lrange rpop llen
        ListOperations listOperations = redisTemplate.opsForList();

        listOperations.leftPushAll("mylist","a","b","c");
        listOperations.leftPush("mylist","d");

        List mylist = listOperations.range("mylist", 0, -1);
        System.out.println(mylist);

        listOperations.rightPop("mylist");

        Long size = listOperations.size("mylist");
        System.out.println(size);
    }
/**
     * 操作集合类型的数据
     */
    @Test
    public void testSet(){
        //sadd smembers scard sinter sunion srem
        SetOperations setOperations = redisTemplate.opsForSet();

        setOperations.add("set1","a","b","c","d");
        setOperations.add("set2","a","b","x","y");

        Set members = setOperations.members("set1");
        System.out.println(members);

        Long size = setOperations.size("set1");
        System.out.println(size);

        Set intersect = setOperations.intersect("set1", "set2");
        System.out.println(intersect);

        Set union = setOperations.union("set1", "set2");
        System.out.println(union);

        setOperations.remove("set1","a","b");
    }
/**
     * 操作有序集合类型的数据
     */
    @Test
    public void testZset(){
        //zadd zrange zincrby zrem
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();

        zSetOperations.add("zset1","a",10);
        zSetOperations.add("zset1","b",12);
        zSetOperations.add("zset1","c",9);

        Set zset1 = zSetOperations.range("zset1", 0, -1);
        System.out.println(zset1);

        zSetOperations.incrementScore("zset1","c",10);

        zSetOperations.remove("zset1","a","b");
    }
/**
     * 通用命令操作
     */
    @Test
    public void testCommon(){
        //keys exists type del
        Set keys = redisTemplate.keys("*");
        System.out.println(keys);

        Boolean name = redisTemplate.hasKey("name");
        Boolean set1 = redisTemplate.hasKey("set1");

        for (Object key : keys) {
            DataType type = redisTemplate.type(key);
            System.out.println(type.name());
        }

        redisTemplate.delete("mylist");
    }

 

 

你可能感兴趣的:(redis,数据库)