Redis

什么是Redis?

Redis是一个基于内存的key-value结构数据库。

特点:
  • 基于内存存储,读写性能高
  • 适合存储热点数据(热点商品、资讯、新闻)
  • 企业应用广泛

Redis简介:

Redis是一个开源的内存中的数据结构存储系统,它可以用作:数据库、缓存和消息中间件

官网:https://redis.io

redis是用c语言开发的一个开源的高性能键值对(key-value)数据库,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。它存储的value类型比较丰富,也被称为结构化的NoSql数据库

NoSql(Not Only SQL),不仅仅是SQL,繁殖非关系型数据库。NoSql数据库并不是要取代关系型数据库,而是关系型数据库的补充

关系型数据库(RDBMS):Mysql、Oracle、DB2、SQLServer

非关系型数据库(NoSql):Redis、Mongo db、MemCached

可用于:
  • 缓存
  • 任务队列
  • 消息队列
  • 分布式锁

Redis下载与安装:

windows版下载地址:https://github.com/microsoftarchive/redis/releases

Linux版下载地址:https://download.redis.io/releases

在Linux系统安装Redis步骤:
  1. 将Redis安装包上传到Linux
  2. 解压安装包,命令:tar -zxvf redis-4.0.0.tar.gz -C /usr/local
  3. 安装Redis的依赖环境gcc,命令:yum install gcc-c++
  4. 进入/usr/local/redis-4.0.0,进行编译,命令make
  5. 进入redis的src目录,进行安装,命令:make install
在windows系统安装Redis步骤:

直接解压:

  • redis.windows.conf:Redis配置文件
  • redis-cli.exe:Redis客户端
  • redis-server.exe:Redis服务端

Redis服务启动与停止:

Linux中redis服务启动与终止:

可以使用redis-server,默认端口号为6379

优化:

让redis后台运行

  1. ​ cd /usr/local/redis-4.0.0
  2. ​ vim redis.conf

进入后由于文件太大,先输入”/”,再输入dae查找到daemonize no,把no修改为yes

重新启动redis

  1. ​ 当前所在目录:/usr/local/redis-4.0.0
  2. ​ 执行命令:src/redis-server ./redis.conf

Ctrl + C 停止Redis服务

windows中redis服务启动与停止 :

  • 直接双击redis-cli.exe,redis服务默认端口号为6379
  • Ctrl +C 停止redis服务

Redis设置密码:

cd /usr/local/redis-4.0.0
vim redis.conf

先输入”/”,再输入# requirepass foobared查找到# requirepass foobared

把注释符号删掉然后修改:requirepass root

重新启动redis

  1. ​ 当前所在目录:/usr/local/redis-4.0.0
  2. ​ 执行命令:src/redis-server ./redis.conf

之后链接Redis会让填写密码:

  • ​ 链接redis:rc/redis-cli -h localhost -p 6379
  • ​ 输入:auth root(填自己的密码)

也可以这样链接:rc/redis-cli -h localhost -p 6379 -a root

远程链接redis:

redis默认不允许远程连接,手动修改为可以允许远程连接:

    修改conf文件:
        cd /usr/local/redis-4.0.0
        vim redis.conf
        /bind
        找到:bind 127.0.0.1   //指定此客户端只能由127.0.0.1链接
        注释掉#bind 127.0.0.1
        注释掉之后就是允许远程连接了
    远程连接满足条件:
        1、Linux系统的Redis要设置密码
        2、开放6379端口:firewall-cmd --zone=public --add-port=6379/tcp --permanent
        3、重新接载防火墙:firewall-cmd --reload
        4、windows PowerShell执行命令的路径是:...\Redis-x64-3.2.100

在windows下远程连接:

在windows下远程连接:
    打开redis-cli.exe所在文件,按住Shift点击右键,选择在此处打开powershell窗口
    在命令窗口里执行命令:
        .\redis-cli.exe -h 192.168.66.100(虚拟机的ip) -p 6379 -a root(登录密码)

Redis数据类型:

Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型

​ 1、字符串 String :普通字符串,常用

​ 2、哈希 hash :hash适合存储对象

​ 3、列表 list :list按照插入顺序排序,可以有重复元素

​ 4、集合 set :set无序集合,没有重复元素

​ 5、有序集合 sorted set :有序集合,没有重复元素

Redis常用命令:(可以参考Redis中文网:https://www.redis.net.cn)

  1. ##### 字符串String操作命令:
  • SET key value:设置指定key的值
  • Get key:获取指定key的值
  • SETEX key seconds value:设置指定key的值,并讲key的过期时间设为seconds秒
  • SETNX key value:只有在key不存在时设置key值
  1. ##### 哈希hash操作命令:
  • HSET key field value:讲哈希表key中的字段field的值设为value
  • HGET key field:获取存储在哈希表中指定字段的值
  • HDEL key field:删除存储在哈希表中的指定字段
  • HKEYS key:获取哈希表中所有字段
  • HVALS key:获取哈希表中所有值
  • HGETALL key:获取在哈希表中指定key的所有字段和值
  1. ##### 列表list操作命令:
  • LPASH key value1 [value2]:将一个或多个值插入到列表头部
  • LRANGE key start stop:获取列表指定范围内的元素
  • RPOP key:移除并获取列表最后一个元素
  • LLEN key:获取列表长度
  • BRPOP key1 [key2] timeout:移除并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
  1. ##### 集合set操作命令:
  • SADD keymember1 [member2]:向集合添加一个或多个成员
  • SMEMBERS key:返回集合中的所有成员
  • SCARD key:获取集合的成员数
  • SINTER key1 [jey2]:返回给定所有集合的交集
  • SUNION key1 [key2]:返回所有给定集合的并集
  • SDIFF key1 [key2]:返回给定所有集合的差集
  • SREM key member1 [menber2]:移除集合中一个或多个成员
  1. ##### 有序集合sorted set操作命令:

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

  • ZADD key score1 member1 [score2 member2]:向有序集合添加一个或多个成员,或者更新已存在成员的分数
  • ZRANGE key start stop [WITHSCORES]:通过索引区间返回有序集合中指定区间内的成员
  • ZINCRBY key increment member:有序集合中对指定成员的分数加上增量increment
  • ZREM key member [menber]:移除有序集合中的一个或多个成员
通用命令:
  • KEYS pattern:查找所有符合给定模式(pattern)的key
  • EXISTS key:检查给定key是否存在
  • TYPE key:返回key所存储的值的类型
  • TTL key:返回给定key的剩余生存时间(TTL,time to live),以秒为单位
  • DEL key:该命令用于在key存在时删除key

在Java中操作Redis:

  • Redis的Java客户端很多,官方推荐的有三种:Jedis、Lettuce、Redisson
  • Spring对Redis客户端进行了整合,提供了Spring Data Redis,在Spring Boot项目中还提供了对应的Starter,即spring-boot-starter-data-redis
Jedis:
Jedis:
    Jedis的maven坐标:
    ---------------------------------------
    <dependency>
        <groupID>redis.clients</groupID>
        <artifactId>jedis</artifactId>
        <version>2.8.0</version>
    </dependency>
    ---------------------------------------
    使用Jedis操作Redis的步骤:
    public void testRedis(){
        //1 获取连接
        Jedis jedis = new Jedis("localhost",6379);
        //2 执行具体的操作
        jedis.set("username","xiaoming");
        //3 关闭连接
        jedis.close();
    }
    ---------------------------------------
Spring Data Redis:

在SoringBoot项目中,可以使用Spring Data Redis来简化Redis操作,maven坐标:

    在SoringBoot项目中,可以使用Spring Data Redis来简化Redis操作,maven坐标:
    ---------------------------------------
    <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类型的数据操作
    ---------------------------------------
    application.yml:

    spring:
      application:
        name: springdataredis_demo
      #Redis相关配置
      redis:
        host: localhost
        port: 6379
        password: root
        #redis默认提供了16个数据库(0号到15号)
        database: 0 #操作的是0号数据库
        jedis:
          #Redis连接池配置
          pool:
            max-active: 8 #最大连接数
            max-wait: 1ms #连接池最大阻塞等待时间
            max-idle: 4 #连接池中的最大空闲连接
            min-idle: 0 #连接池中的最小空闲连接
    ---------------------------------------
    通过redisTemplate.opsForValue().set("city123","beijing");保存的key和value会被序列化之后再存进去,为了方便观察,通过配置类,设置一个新的序列化器把key还原成原来的key
    RedisConfig.java
    @Configuration
    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.setHashKeySerializer(new StringRedisSerializer());
            redisTemplate.setConnectionFactory(connectionFactory);
            return redisTemplate;
        }
    }
    ---------------------------------------

测试示范:
    ---------------------------------------
    /**
     * 操作String类型数据
     */
    @Test
    public void testString(){
        redisTemplate.opsForValue().set("city123","beijing");
        String value = (String) redisTemplate.opsForValue().get("city123");
        System.out.println(value);
        redisTemplate.opsForValue().set("key1","value1",10l, TimeUnit.SECONDS);
        Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("city1234", "nanjing");
        System.out.println(aBoolean);
    }
    ---------------------------------------
    /**
     * 操作Hash类型数据
     */
    @Test
    public void testHash(){
        HashOperations hashOperations = redisTemplate.opsForHash();
        //存值
        hashOperations.put("002","name","xiaoming");
        hashOperations.put("002","age","20");
        hashOperations.put("002","address","bj");
        //取值
        String age = (String) hashOperations.get("002", "age");
        System.out.println(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 value : mylist) {
            System.out.println(value);
        }
        //获得列表长度 llen
        Long size = listOperations.size("mylist");
        int lSize = size.intValue();
        for (int i = 0; i < lSize; i++) {
            //出队列
            String element = (String) listOperations.rightPop("mylist");
            System.out.println(element);
        }
    }
    ---------------------------------------
    /**
     * 操作Set类型的数据
     */
    @Test
    public void testSet(){
        SetOperations setOperations = redisTemplate.opsForSet();
        //存值
        setOperations.add("myset","a","b","c","a");
        //取值
        Set<String> myset = setOperations.members("myset");
        for (String o : myset) {
            System.out.println(o);
        }
        //删除成员
        setOperations.remove("myset","a","b");
        //取值
        myset = setOperations.members("myset");
        for (String o : myset) {
            System.out.println(o);
        }
    }
    ---------------------------------------
    /**
     * 操作ZSet类型的数据
     */
    @Test
    public void testZset(){
        ZSetOperations zSetOperations = redisTemplate.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","b",20.0);
        //取值
        myZset = zSetOperations.range("myZset", 0, -1);
        for (String s : myZset) {
            System.out.println(s);
        }
        //删除成员
        zSetOperations.remove("myZset","a","b");
        //取值
        myZset = zSetOperations.range("myZset", 0, -1);
        for (String s : myZset) {
            System.out.println(s);
        }
    }
    ---------------------------------------
    /**
     * 通用操作,针对不同的数据类型都可以操作
     */
    @Test
    public void testCommon(){
        //获取Redis中所有的key
        Set<String> keys = redisTemplate.keys("*");
        for (String key : keys) {
            System.out.println(key);
        }
        //判断某个key是否存在
        Boolean itcast = redisTemplate.hasKey("itcast");
        System.out.println(itcast);
        //删除指定key
        redisTemplate.delete("myZset");
        //获取指定key对应的value的数据类型
        DataType dataType = redisTemplate.type("myset");
        System.out.println(dataType.name());
    }
    ---------------------------------------
创作不易!转载请注明作者及文章链接或作者博客链接——
- 作者:pidanxia
- 链接:https://pidanxia.ink
(链接可为:**文章链接**或者**作者博客链接**)
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇