❤ 超强超详细 | Redis入门详解

Posted 经理,天台风好大

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了❤ 超强超详细 | Redis入门详解相关的知识,希望对你有一定的参考价值。

文章目录


一、Nosql与Redis概述

1、Nosql的优势

(1)使用nosql解决cpu与内存压力

(2)使用nosql解决I/O压力

2、Nosql数据库的概述

(1)NoSql= Not Only SQL

(2)采用key-value模式存储

(3)不遵循SQL标准

(4)性能远超过SQL

3、使用场景

(1)数据的高并发读写

(2)海量数据读写

(3)数据可扩展性

4、不适用场景

(1)需要事务的支持

(2)基于sql的结构化查询存储,需要即席查询

5、 Redis概述

(1)开源的key-value系统

(2)支持String、List、Set、zset、hash等数据类型

(3)数据库支持push/pop/add/remove操作

(3)支持不同方式的排序

(4)可写入内存也可以持久化

(5)主从同步功能

二、Redis6安装与使用

1、官网下载:放入liunx对应目录内

2、使用yum安装gcc编译环境

yum -y install gcc gcc-c++ kernel-devel //安装gcc、c++编译器以及内核文件

测试gcc版本,gcc --version 或者 gcc -v

3、解压缩:tar zxvf redis-6.2.5.tar.gz (我的放在新建的soft目录下了)

4、进入redis-6.2.5 目录执行make命令

cd /soft/redis-6.2.5
make

5、执行安装make install

6、验证安装成功

cd /usr/local/bin
ll


7、相关软件介绍:

  • redis-benchmar:性能测试工具
  • redis-check-aof:修改有问题的AOF
  • redis-check-rdb:修改有问题的rdb文件
  • redis-sentinel:Redis的集群使用
  • redis-server:Redis服务器集群使用
  • redis-cli:客户端,操作入口

8、前台启动(不推荐)

9、后台启动
(1)复制配置文件

cp -r redis.conf /opt/


(2)修改参数配置,将 daemonize no 改为 daemonize yes ,让服务支持在后台启动

[root@localhost redis-6.2.4]# cd /opt/
[root@localhost opt]# vi redis.conf


(3)启动redis

[root@localhost bin]# cd /usr/local/bin/
[root@localhost bin]# redis-server /opt/redis.conf 
[root@localhost bin]# ps -ef|grep redis


(4)使用redis-cli测试

10、redis关闭

(1)redis-cli shutdown(进入终端shutdown也可以)

(2)kill -9 xxx(进程)

三、常用五大数据类型

(一)Redis key操作

  1. 查看所有key:keys *

  2. 添加 key value:set

  3. 判断key是否存在 exists

  4. 查看key的类型:type

  5. 删除key数据:del

  6. 选择非阻塞删除:unlink(异步删除)

  7. 设置key的过期时间(秒):expire

  8. 查看ttl过期时间(秒):ttl(-1永久不过期,-2已经过期)

  9. 切换数据库:select

  10. 查看当前数据库的key数量:dbsize

  11. 清空当前库内数据 flushdb (慎用)

  12. 通杀所有库内数据 flushall (慎用)

(二)Redis字符串(String)

  1. 简介:字符串,一个key对应一个value,是二进制安全的,是Redis最基本数据类型,value最多512M,底层为动态字符串,ArrayList

  2. 设置值,相同key值覆盖:set
    set k1 v100

  3. 获取值:get
    get k1

  4. 追加值:append,返回总长度
    append k1 abcd

  5. 获取值的长度:strlen
    strlen k1

  6. 当key存在时操作:setnx,设置成功返回1,设置失败返回0
    setnx k1 v1

  7. 将数字类型值+1/-1:incr/decr,原子性操作,不受多线程机制打断。
    incr k3
    decr k3

  8. 将key存储的数字值递增x/递减x:incrby/decrby
    incrby k3 10
    decrby k3 5

  9. 同时设置一个或多个key-value键值对:mset
    mset k1 v1 k2 v2 k3 v3

  10. 同时获取一个或多个value:mget
    mget k1 k2 k3

  11. 设置多个key-value(当key都不存在时设置成功):msetnx
    msetnx k11 v11 k12 v12 k13 v13
    msetnx k1 v11 k4 v4

  12. 获取范围的值(开始-结束):getrange
    getrange name 0 3

  13. 设置范围的值(开始位置-覆盖):setrange,返回总长度
    setrange name 3 abc

  14. 设置key的同时设置过期时间:setex
    setex age 20 value30

  15. 以新值换旧值(显示旧值):getset
    getset name jack

(三)Redis列表(List)

  1. 简介:单键多值的字符串列表,可以按照插入顺序排序,底层为双向链表(zipList(数据少时)->quickList(数据多时))

  2. 从左边/右边插入一个或多个值:lpush/rpush,返回数组长度

  3. 按照索引下标(范围)获取元素,从左到右(0表示左边第一个,-1表示右边第一个):lrange

  4. 从左边或右边取出一个值:lpop/rpop

  5. 从k1列表右边吐出一个值,插入到v2列表的左边:rpoplpush

  6. 按照索引下标(单值)获取元素(从左到右):lindex

  7. 获取列表的长度:llen
    llen k1

  8. 在key对应的value前面/后面插入new value:linset before/after
    linsert k1 before "v3" "v31"
    linsert k1 after "v2" "v21"

  9. 从左边删除n个对应的value:lrem
    lrem k1 2 "new11"

  10. 将列表key下标为index的值替换成value:lset
    lset k1 1 "new31"

(四)Redis集合(Set)

  1. Redis Set是String类型的无序集合,它的底层其实是一个value为null的hash表,value自动排重且无序

  2. 将一个或多个元素加入到集合key中:sadd,已经存在元素将忽略
    sadd k1 v1 v2 v3

  3. 取出集合中的所有值:smembers
    smembers k1

  4. 判断key集合中是否包含对应的value:sismember,1有0无
    sismember k1 v1

  5. 返回集合中元素个数:scard
    scard k1

  6. 从集合中删除某一个或多个元素:srem
    srem k1 v1

  7. 随机从该集合吐出一个元素:spop
    spop k1

  8. 随机从集合中取出n个值,不会从集合中删除:srandmember
    srandmember k1 2

  9. 把集合中的一个值从一个集合移动到另一个集合:smove
    smove k1 k2 v3

  10. 取两个集合的交集/并集/差集(key1中存在,key2中不存在):sinter/sunoin/sdiff
    inter k2 k3
    sunion k2 k3
    sdiff k2 k3

(五)Redis哈希(Hash)

  1. 简介:是一个String类型的field和value的映射表,hash适合用来存储对象。类似java中Map<String,Object>,底层为zipList(数据量少)或hashtable(数据量较多)
  2. 向hash内添加数据(key-field-value):hset
    hset user:1001 id 1
    hset user:1001 name zhangsan
  3. 从集合中取出数据(key-field):hget
    hget user:1001 id
    hget user:1001 name
  4. 批量添加数据:hmet
    hmset user:1002 id 2 name lisi age 30
  5. 判断哈希表key中,field是否存在:hexists,1有0无
    hexists user:1002 id
    hexists user:1002 name
    hexists user:1002 gender
  6. 查看哈希表中所有field:hkeys
    hkeys user:1002
  7. 查看哈希表内所有value:hvals
    hvals user:1002
  8. 对应的key、field的值增量+1:hincrby
    hincrby user:1002 age 2
  9. 添加数据,仅当field不存在时:hsetnx
    hsetnx user:1002 age 40
    hsetnx user:1002 gender 1

(六)Redis有序集合(Zset)

  1. 简介:有序的,类似set,没有重复元素,关联了score并可以进行排序,底层架构类似Map<String,value>,Zset底层为hash以及跳跃表
  2. 将一个或多个元素以及score加入到有序集合key中:zadd
    clear
    zadd topn 200 java 300 c++ 400 mysql 500 php
  3. 取出返回有序集合key中,下标在<start><stop>之间:zrange,自动按照score排序,[withscores]可以返回评分
    zrange topn 0 -1
    zrange topn 0 -1 withscores
  4. 取出score值介于min和max之间的成员,按照score从小到大排序:zrangebyscore <key> <min> <max> [withscores] [limit offset count]
    zrangebyscore topn 300 500 withscores
  5. zrevngebyscore <key><max><min>[withscores][limit offset count]
  6. 为元素score加上增量:zincrby<key><increment><value>
    zincrby topn 50 java
  7. 删除该集合中下,指定元素的值:zrem<key><value>
    zrem topn php
  8. 统计该集合,分数区间内的元素个数:zcount<key><min><max>
    zcount topn 200 300
  9. 返回该值在集合中的排名,从0开始:zrank<key><value>
    zrank topn c++

四、Redis6配置文件详解

1、units单位:

只支持bytes,支持bit,不区分大小写

2、INCLUDES:

包含其他的配置文件

3、NETWORK:网络相关配置

  1. bind:限定是否只能本机连接等
  2. protected-mode:是否开启本机保护模式,只可本机访问
  3. port:默认端口号6379
  4. tcp-backlog:正在进行三次握手的队列总和默认值为511
  5. timeout:超时时间默认0,永不超时
  6. tcp-keepalive:检测心跳时间默认300秒
  7. daemonize:是否支持后台启动
  8. pidfile:保存对应的进程号文件
  9. loglevel:保存日志的级别
  10. logfile:设置日志的路径
  11. databases:默认使用16个库
  12. Security密码设置:
    # foobared 取消注释,设置对应的密码信息
  13. LIMITS限制:
    maxclients:最大连接数,默认10000
  14. maxmemory:内存上限:

五、Redis6的发布和订阅

1、发布与订阅:

(1)发送者:pub发送消息

(2)订阅者:sub接受消息

redis客户端可以订阅任意数量的频道

2、发布订阅流程

(1)客户端可以订阅频道

(2)当这个频道发布消息后,消息就会发送给订阅的客户端

3、发布订阅的命令行实现

  1. 打开一个客户端订阅channel1
    subscribe channel1
  2. 打开另一个客户端,给channel1发布消息hello
    publish channel1 hello
  3. 打开第一个客户端,可以看到发送的消息

六、Redis6新数据类型

1、Bitmaps

  1. 简介:实现对字符串的位的操作的字符串。是一个以位位单元的数组,数组每个单元只能存储0与1,下标与偏移量,与set相比节省gongjinaq
  2. 设置Bitmaps中某个偏移量的值(0或1):setbit<key><offset><value>
  3. 获取Bitmaps中某个偏移量的值:getbit<key><offset>
    getbit users:20210101 1
  4. 统计字符串被设置位1的bit数量:bitcount[begin][end]
    bitcount users:20210101
    bitcount users:20210101 1 5
  5. 复合操作(交集/并集/非/异或):bitop and/or/not/xor
    设置初始数据:

    计算出两天都访问过网站的用户数量:(1与9号用户两天都访问了)
    bitop and unique:users:and:20201104_03 unique:users:20201103 unique:users:20201104
    bitcount unique:users:and:20201104_03

    计算出任意一天都访问过网站的用户数量
    bitop or unique:users:or:20201104_03 unique:users:20201103 unique:users:20201104
    bitcount unique:users:or:20201104_03

2、HyperLogLog

  1. 简介:适用于独立IP数、搜索记录等需要去重和计数时。
  2. 添加指定元素到HyperLogLog:pdadd<key><element>[element],1成功0失败
    pfadd program "java"
    pfadd program "php"
    pfadd program "java"
    pfadd program "c++" "mysql"
  3. 统计HLL的pfcount<key>
  4. 将一个或多个HLL合并的结果存储在另一个HLL:pfmeger
    pfmerge k100 k1 program

3、Geospatial

  1. 简介:redis3.2后增加GEO类型,即地理信息的缩写,提供了经纬度的设置、查询、范围查询、举例查询、经纬度hash等
  2. 加地理位置(经度、纬度、名称):geoadd<key><longitude><latitude><member>[<longitude><latitude><member>]...
    有效经纬度:-180°-180°,纬度:-85.05112878°-85.05112878°
  3. 获取指定地区的坐标值:geoos<key><member>[member]...
    geopos china:city shanghai
    geopos china:city beijing
  4. 获取两个位置之间的直线距离:geodist<key><member2><member2><单位>
    geodist china:city beijing shanghai km
  5. 以给定的经纬度为中心,找出某一半径内的元素:georadius<key><longitude><latitude>radius m|km|ft|mi

七、Jedis操作Redis6

1、idea建立maven工程

2、引入相关依赖:

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

3、jedis连接redis测试(Maven)

package cn.tedu.jedis;

import redis.clients.jedis.Jedis;

/**
 * @author archibald
 * @date 2021/9/8
 * @apiNote
 */
public class jedisDemo1 
    public static void main(String[] args) 
        //创建Jedis对象,需要修改redis.conf的bind(注释)与protected-mode(no)配置
        Jedis jedis =new Jedis("192.168.170.107",6379);
        //测试
        String value = jedis.ping();
        System.out.println(value);
    

显示结果如下:

4、Jedis-API:操作key

//操作key
    @Test
    public void demo1()
        //创建Jedis对象,需要修改redis.conf的bind(注释)与protected-mode(no)配置
        Jedis jedis =new Jedis("192.168.170.107",6379);
        //清空redis
        jedis.flushDB();
        //添加数据
        jedis.set("k1","v1");
        jedis.set("k2","v2");
        jedis.set("k3","v3");
        //查询所有key值
        Set<String> keys = jedis.keys("*");
        for(String key:keys)
            System.out.println(key);
        
        //根据key获取value
        String value = jedis.get("k1");
        System.out.println("k1对应的value为:"+value);
    

查看运行结果:

5、Jedis-API:操作String

//操作String
    @Test
    public void demo2()
        //创建Jedis对象,需要修改redis.conf的bind(注释)与protected-mode(no)配置
        Jedis jedis =new Jedis("192.168.170.107",6379);
        //清空redis
        jedis.flushDB();
        //添加多个数据
        jedis.mset("str1","v1","str2","v2","str3","v3");
        //查询所有key值
        System.out.println(jedis.mget("str1","str2","str3"));
    

查看运行结果:

6、Jedis-API:操作List

//操作List
    @Test
    public void demo3()
        //创建Jedis对象,需要修改redis.conf的bind(注释)与protected-mode(no)配置
        Jedis jedis =new Jedis("192.168.170.107",6379);
        //清空redis
        jedis.flushDB();
        //添加数据
        jedis.lpush("k1","lucy","mary","jack");
        //查询数据
        List<String> value = jedis.lrange("k1", 0, -1);
        System.out.println(value);
    

查看运行结果:

7、Jedis-API:操作set

//操作set
    @Test
    public void demo4()
        //创建Jedis对象,需要修改redis.conf的bind(注释)与protected-mode(no)配置
        Jedis jedis =new Jedis("192.168.170.107",6379);
        //清空redis
        jedis.flushDB();
        //添加数据
        jedis.sadd("name","luck","mary","jack");
        //查询数据
        Set<String> names = jedis.smembers("name");
        System.out.println(names);
    

查看运行结果:

8、Jedis-API:操作set

//操作set
    @Test
    public void demo5()
        //创建Jedis对象,需要修改redis.conf的bind(注释)与protected-mode(no)配置
        Jedis jedis =new Jedis("192.168.170.107",6379);
        //清空redis
        jedis.flushDB();
        //添加数据
        jedis.sadd("orders","order1");
        jedis.sadd("orders","order2");
        jedis.sadd("orders","order3");
        jedis.sadd("orders","order4");
        //查询数据
        Set<String> orders1 = jedis.smembers("orders");
        System.out.println(orders1);
        //删除后再查询
        jedis.srem("orders","order1");
        Set<String> orders2 = jedis.smembers("orders");
        System.out.println(orders2);
    

查看运行结果:

9、Jedis-API:操作Hash

//操作Hash
    @Test
    public void demo6()
        //创建Jedis对象,需要修改redis.conf的bind(注释)与protected-mode(no)配置
        Jedis jedis =new Jedis("192.168.170.107",6379);
        //清空redis
        jedis.flushDB();
        //添加数据
        jedis.hset("users","age","20");
        //查询数据
        String hget = jedis.hget("users", "age");
        System.out.println(hget);
    

查看运行结果:

10、Jedis-API:操作Zset

//操作Zset
    @Test
    public void demo7()
        //创建Jedis对象,需要修改redis.conf的bind(注释)与protected-mode(no)配置
        Jedis jedis =new Jedis("192.168.170.107",6379);
        //清空redis
        jedis.flushDB();
        //添加数据
        jedis.zadd("china",100d,"shanghai");
        //查询数据
        Set<String> china = jedis.zrange("china", 0, -1);
        System.out.println(china);
    

查看运行结果:

八、Redis6与Spring Boot整合

1、idea创建springboot工程

2、po

以上是关于❤ 超强超详细 | Redis入门详解的主要内容,如果未能解决你的问题,请参考以下文章

超强超详细Redis入门教程

超强超详细Redis数据库入门教程

超强超详细Redis数据库入门教程

Redis入门教程

Redis学习推荐

redis 模糊查找keys