CentOS上redis的安装及基本使用

一、安装

wget工具下载:yum -y install wget

在CentOS上安装redis:

$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz
$ tar xzf redis-5.0.5.tar.gz 解压
$ cd redis-5.0.5
$ make 编译

解压redis到指定位置:tar xzf redis-5.0.5.tar.gz -C /usr/local

编译好后显示:
image.png

配置在任意地方都可以执行redis命令(src目录下执行命令):make install

二、启动服务

1.前台启动 ./redis-server

启动之后当前窗口停留,不能执行其他操作,ctrl+c退出,服务也停止了
进入src目录下执行redis-server

image.png

2.后台启动:./redis-server &

image.png

敲击回车可执行其他命令,服务未停止
查看redis进程:ps -ef | grep redis
image.png

src下的redis-cli为命令行客户端 ./redis-cli

image.png

三、关闭redis

1.使用客户端关闭(推荐此种方式)

切换到src目录,执行./redis-cli shutdown

2.使用kill命令杀掉该进程

使用ps -ef | grep redis 查出进程号,再执行 kill pid
如果kill pid不能执行成功,可以使用kill -9 pid强制杀掉

或者在客户端里面执行shutdown命令
使用./redis-cli命令进入客户端,执行shutdown命令

连接指定ip和端口的redis:./redis-cli -h 127.0.01 -p 6379

-h:redis 主机ip (可以指定任意的redis服务器)
-p:端口号(不同的端口表示不同的redis应用)

四、使用图形化界面

安装redis图形化界面,测试连接连不上,因为redis本身有安全策略,默认只有本机可以连接

修改redis配置文件:
①bind ip:绑定ip此行注释
②protected-mode yes:保护模式改为no
使用vi命令修改redis.conf文件,修改前备份,执行cp命令:cp redis.conf redis_bak.conf

修改:
搜索关键字:未按i之前输入/bind
n去到下一个,找到后按i进行编辑修改,修改完毕按esc退出编辑模式,最后:wq保存

修改之后每次重新启动redis时都需要加载该配置文件,否则修改的内容不起作用:./redis-server ../redis.conf &

查看防火墙状态:systemctl status firewalld

image.png

五、redis基本命令的使用

1.redis数据结构及对应操作命令

①字符串类型string
存储:set key value
获取:get key
删除:del key
image.png

②哈希类型 hash(map格式)
存储:hset key field value
获取:hget key field

  • hget key field:获取指定的field对应的值
  • hgetall key:获取所有的field和value

删除:hdel key field
image.png

③列表类型 list(linkedlist格式)(可重复)
存储:

  • lpush key value:将元素加入列表左边
  • rpush key value:将元素加入列表右边

获取:

  • lrange key start end:范围获取

删除:

  • lpop key:删除列表最左边的元素并返回
  • rpop key:删除列表最右边的元素并返回

image.png

image.png

④集合类型 set(不可重复)
存储:sadd key value
获取:smembers key:获取set集合中所有元素
删除:srem key value

image.png

⑤有序集合类型 sortedset(有序,不可重复)
存储:zadd key score value
获取:zrange key start end
删除:zrem key value

image.png

2.redis常用命令

查询所有间:keys *(尽量少使用keys * redis是单线程的)
获取键的类型:type key
删除指定key:del key
image.png

操作redis:

image.png

默认访问第0个库:
查看当前库的key数量:dbsize

image.png

所有库的数量在配置文件redis.conf中:
image.png

image.png

0库不显示数字
image.png

删除当前库中的所有数据:flushdb

image.png

退出客户端(服务未停止):exit或quit
image.png

exist判断一个或多个key在当前库中是否存在 ,返回整数

expire 设置key的存活时间

六、redis持久化

redis是一个内存数据库,当redis服务器重启,,数据会丢失,需要将redis内存中的数据持久化保存到硬盘的文件中。

1.RDB

默认方式,不需要进行配置,默认就使用这种机制
在一定的间隔时间中,检测key的变化情况,然后持久化数据
image.png

image.png
save 开头的一行就是持久化配置,可以配置多个条件(每行配置一个条件),每个条件之间是“或”的关系。
“save 900 1”表示15分钟(900秒钟)内至少1个键被更改则进行快照。
“save 300 10”表示5分钟(300秒)内至少10个键被更改则进行快照。

修改后要重启服务器

2.AOP

日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据
默认情况下Redis没有开启AOF(append only file)方式的持久化,通过修改redis.conf配置文件中的appendonly参数开启

image.png

修改为appendonly yes
开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件。
修改配置:
image.png

# appendfsync always: 每一次操作都进行持久化
appendfsync everysec : 每隔一秒进行一次持久化
# appendfsync no : 不进行持久化

七、Jedis

Redis不仅是使用命令来操作,主流的语言都有客户端支持,比如java、C、C#、C++、php、Node.js、Go等。Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。 
在企业中用的最多的就是Jedis,Jedis同样也是托管在github上,地址:https://github.com/xetorthio/jedis

①依赖:

        <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.0.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.6.2</version>
        </dependency>

②demo:

public class JedisTest {
    @Test
    public void test1(){
        //获取连接
        Jedis jedis = new Jedis("120.24.62.115",6379);
        jedis.set("myidol","Eason");
        jedis.close();
    }
}

问题来了:在使用之前,如果是一台崭新的服务器,那么很可能会遇到下面的错误:

image.png

猜测可能的原因:
1.本地网络问题
2.本地防火墙端口问题
3.目标服务器网络问题
4.目标服务器防火墙端口问题
5.目标服务器该端口对应的程序是否已启动
6.目标服务器该端口对应的程序设置问题(比如是否运行远程连接)

不用说 都有灵感是防火墙端口问题了 嗯:下面来设置一下:(手把手教学系列)
image.png

image.png

image.png

image.png

image.png

image.png

image.png

入和出都设置一下,我这种设置是最不安全的了,但我又懒又笨,就这样了。

设置完服务器端口后执行程序,报下面错误:
image.png

解决:Redis服务处于保护模式,需要修改配置文件redis.conf。将NETWORK下的protected-mode yes修改为protected-mode no,然后重启服务
image.png
但是发现依旧没用。。。
经过我的冥思苦想(其实是去百度了一下),还需要把绑定的ip注释掉(why?我也不懂原理 ,嗯),操作如下:
image.png
接着,发现还是没用(笑脸),图样图森破,后面再经过我的一番折腾,原来配置文件修改了,如果不指定,是根本不生效的,还是走的默认的,就是必须在启动的时候同时启动配置文件,修改的才有用:./redis-server ../redis.conf &
再跑起我的demo,终于好了。

image.png

总结一下:
1.允许服务器访问端口
2.修改redis的保护模式protected-mode no
3.注释掉bind 127.0.0.1
4.启动时指定配置文件./redis-server ../redis.conf &

使用java操作redis数据:
①string 数据结构

    @Test
    public void test2(){
        //1. 获取连接 (如果使用空参构造,默认值 "localhost",6379端口)
        Jedis jedis = new Jedis();
        //存储
        jedis.set("username","hcx");
        //获取
        String username = jedis.get("username");
        System.out.println(username);

        //可以使用setex()方法存储可以指定过期时间的 key value
        jedis.setex("activecode",20,"hello");//将activecode:hehe键值对存入redis,并且20秒后自动删除该键值对

        //3. 关闭连接
        jedis.close();
    }

②hash 数据结构

    @Test
    public void test3(){
        //获取连接
        Jedis jedis = new Jedis();
        // 存储hash
        jedis.hset("user","name","chaochao");
        jedis.hset("user","age","27");
        jedis.hset("user","gender","male");

        // 获取hash
        String name = jedis.hget("user", "name");
        System.out.println(name);

        // 获取hash的所有map中的数据
        Map<String, String> user = jedis.hgetAll("user");

        // keyset
        Set<String> keySet = user.keySet();
        for (String key : keySet) {
            //获取value
            String value = user.get(key);
            System.out.println(key + ":" + value);
        }

        //3. 关闭连接
        jedis.close();
    }

③list 数据结构

    @Test
    public void test4(){
        //1. 获取连接
        Jedis jedis = new Jedis();
        //2. 操作
        // list 存储
        jedis.lpush("mylist","a","b","c");//从左边存
        jedis.rpush("mylist","a","b","c");//从右边存

        // list 范围获取
        List<String> mylist = jedis.lrange("mylist", 0, -1);
        System.out.println(mylist);
        
        // list 弹出
        String element1 = jedis.lpop("mylist");//c
        System.out.println(element1);

        String element2 = jedis.rpop("mylist");//c
        System.out.println(element2);

        // list 范围获取
        List<String> mylist2 = jedis.lrange("mylist", 0, -1);
        System.out.println(mylist2);

        //3. 关闭连接
        jedis.close();
    }

④set 数据结构

    @Test
    public void test5(){
        //1. 获取连接
        Jedis jedis = new Jedis();
        // set 存储
        jedis.sadd("myset","a","b","c");

        // set 获取
        Set<String> myset = jedis.smembers("myset");
        System.out.println(myset);

        //3. 关闭连接
        jedis.close();
    }

⑤sortedset 数据结构

    @Test
    public void test6(){
        //1. 获取连接
        Jedis jedis = new Jedis();
        // sortedset 存储
        jedis.zadd("mysortedset",98,"肥朝");
        jedis.zadd("mysortedset",97,"师长");
        jedis.zadd("mysortedset",99,"烟哥");

        // sortedset 获取
        Set<String> mysortedset = jedis.zrange("mysortedset", 0, -1);
        System.out.println(mysortedset);
        //3. 关闭连接
        jedis.close();
    }
Jedis连接池

jedis.properties

host=127.0.0.1
port=6379
maxTotal=50
maxIdle=10

JedisPool工具类:

package cn.hcx.jedis.util;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 JedisPool工具类
    加载配置文件,配置连接池的参数
    提供获取连接的方法
 */
public class JedisPoolUtils {

    private static JedisPool jedisPool;

    static{
        //读取配置文件
        InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");
        //创建Properties对象
        Properties pro = new Properties();
        //关联文件
        try {
            pro.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //获取数据,设置到JedisPoolConfig中
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));
        config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));

        //初始化JedisPool
        jedisPool = new JedisPool(config,pro.getProperty("host"),Integer.parseInt(pro.getProperty("port")));
    }

    /**
     * 获取连接
     */
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }
}

使用:

    @Test
    public void test8(){
        
        //通过连接池工具类获取
        Jedis jedis = JedisPoolUtils.getJedis();

        //3. 使用
        jedis.set("hello","world");

        //4. 关闭 归还到连接池中
        jedis.close();;

    }

jedis配置详解:

#最大活动对象数     
redis.pool.maxTotal=1000    
#最大能够保持idel状态的对象数      
redis.pool.maxIdle=100  
#最小能够保持idel状态的对象数   
redis.pool.minIdle=50    
#当池内没有返回对象时,最大等待时间    
redis.pool.maxWaitMillis=10000    
#当调用borrow Object方法时,是否进行有效性检查    
redis.pool.testOnBorrow=true    
#当调用return Object方法时,是否进行有效性检查    
redis.pool.testOnReturn=true  
#“空闲链接”检测线程,检测的周期,毫秒数。如果为负值,表示不运行“检测线程”。默认为-1.  
redis.pool.timeBetweenEvictionRunsMillis=30000  
#向调用者输出“链接”对象时,是否检测它的空闲超时;  
redis.pool.testWhileIdle=true  
# 对于“空闲链接”检测线程而言,每次检测的链接资源的个数。默认为3.  
redis.pool.numTestsPerEvictionRun=50  
#redis服务器的IP    
redis.ip=xxxxxx  
#redis服务器的Port    
redis1.port=6379  

八、Spring Data Redis

在SpringData中已经整合了redis了,只需要注入即可使用
①引入依赖:

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

②配置redis:

spring:
  redis:
    host: xxx.xx.xx.xx

③使用:

@Autowired
private StringRedisTemplate redisTemplate;

public Boolean test(String param) {
    /**
     * K key:键
     * V value:值
     * final long timeout:过期时间
     * final TimeUnit unit:单位
     */
    this.redisTemplate.opsForValue().set("myKey", "123", 5, TimeUnit.MINUTES);
    return true;
}
1.五种结构:
  • String:等同于java中的,Map<String,String>
  • list:等同于java中的Map<String,List<String>>
  • set:等同于java中的Map<String,Set<String>>
  • sort_set:可排序的set
  • hash:等同于java中的:Map<String,Map<String,String>>
2.RedisTemplate基本操作

Spring Data Redis 提供了一个工具类:RedisTemplate。
里面封装了对于Redis的五种数据结构的各种操作:

  • redisTemplate.opsForValue() :操作字符串
  • redisTemplate.opsForHash() :操作hash
  • redisTemplate.opsForList():操作list
  • redisTemplate.opsForSet():操作set
  • redisTemplate.opsForZSet():操作zset
3.StringRedisTemplate

RedisTemplate在创建时,可以指定其泛型类型:

  • K:代表key 的数据类型
  • V: 代表value的数据类型

注意:这里的类型是Java中的数据类型,RedisTemplate会自动将Java类型转为Redis支持的数据类型:字符串、字节、二进制等。

RedisTemplate默认会采用JDK自带的序列化(Serialize)来对对象进行转换。生成的数据十分庞大,因此一般会指定key和value为String类型,自己把对象序列化为json字符串来存储。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值