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,"eason");
        jedis.zadd("mysortedset",97,"EF");
        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字符串来存储。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容