1. Redis的使用

1.1.    Redis的安装

Redis是c语言开发的。

安装redis需要c语言的编译环境。如果没有gcc需要在线安装。yum install gcc-c++

 

安装步骤:

第一步:redis的源码包上传到linux系统。

第二步:解压缩redis。

第三步:编译。进入redis源码目录。make

第四步:安装。make install PREFIX=/usr/local/redis

PREFIX参数指定redis的安装目录。一般软件安装到/usr目录下

1.2 连接redis

1.2.1 redis的启动:

前端启动:在redis的安装目录下直接启动redis-server

[root@localhost bin]# ./redis-server

 

后台启动:

把/root/redis-3.0.0/redis.conf复制到/usr/local/redis/bin目录下
[root@localhost redis-3.0.0]# cp redis.conf /usr/local/redis/bin/

修改配置文件:

redis crontab用法 redis -c_redis

[root@localhost bin]# ./redis-server redis.conf

查看redis进程:

[root@localhost bin]# ps aux|grep redis
root      5190  0.1  0.3  33936  1712 ?        Ssl  18:23   0:00 ./redis-server *:6379   
root      5196  0.0  0.1   4356   728 pts/0    S+   18:24   0:00 grep redis
[root@localhost bin]#

1.2.2 redis-cli

[root@localhost bin]# ./redis-cli
默认连接localhost运行在6379端口的redis服务。
[root@localhost bin]# ./redis-cli -h 192.168.25.153 -p 6379
-h:连接的服务器的地址
-p:服务的端口号
关闭redis:[root@localhost bin]# ./redis-cli shutdown

1.3Redis五种数据类型

String:key-value(做缓存)

Redis中所有的数据都是字符串。命令不区分大小写,key是区分大小写的。Redis是单线程的。Redis中不适合保存内容大的数据。

get、set、

incr:加一(生成id)

Decr:减一

 

Hash:key-fields-values(做缓存)

相当于一个key对于一个map,map中还有key-value

使用hash对key进行归类。

Hset:向hash中添加内容

Hget:从hash中取内容

 

List:有顺序可重复
192.168.25.153:6379> lpush list1 a b c d
(integer) 4
192.168.25.153:6379> lrange list1 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
192.168.25.153:6379> rpush list1 1 2 3 4
(integer) 8
192.168.25.153:6379> lrange list1 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
5) "1"
6) "2"
7) "3"
8) "4"
192.168.25.153:6379>
192.168.25.153:6379> lpop list1
"d"
192.168.25.153:6379> lrange list1 0 -1
1) "c"
2) "b"
3) "a"
4) "1"
5) "2"
6) "3"
7) "4"
192.168.25.153:6379> rpop list1
"4"
192.168.25.153:6379> lrange list1 0 -1
1) "c"
2) "b"
3) "a"
4) "1"
5) "2"
6) "3"
192.168.25.153:6379>
 
Set:元素无顺序,不能重复
192.168.25.153:6379> sadd set1 a b c c c d
(integer) 4
192.168.25.153:6379> smembers set1
1) "b"
2) "c"
3) "d"
4) "a"
192.168.25.153:6379> srem set1 a
(integer) 1
192.168.25.153:6379> smembers set1
1) "b"
2) "c"
3) "d"
192.168.25.153:6379>
还有集合运算命令,自学。
 
SortedSet(zset):有顺序,不能重复
192.168.25.153:6379> zadd zset1 2 a 5 b 1 c 6 d
(integer) 4
192.168.25.153:6379> zrange zset1 0 -1
1) "c"
2) "a"
3) "b"
4) "d"
192.168.25.153:6379> zrem zset1 a
(integer) 1
192.168.25.153:6379> zrange zset1 0 -1
1) "c"
2) "b"
3) "d"
192.168.25.153:6379> zrevrange zset1 0 -1
1) "d"
2) "b"
3) "c"
192.168.25.153:6379> zrange zset1 0 -1 withscores
1) "c"
2) "1"
3) "b"
4) "5"
5) "d"
6) "6"
192.168.25.153:6379> zrevrange zset1 0 -1 withscores
1) "d"
2) "6"
3) "b"
4) "5"
5) "c"
6) "1"
192.168.25.153:6379>
 
1.4 Key命令
设置key的过期时间。
Expire key second:设置key的过期时间
Ttl key:查看key的有效期
Persist key:清除key的过期时间。Key持久化。
 
192.168.25.153:6379> expire Hello 100
(integer) 1
192.168.25.153:6379> ttl Hello
(integer) 77

1.5Redis设置过期通知机制

①发布key过期消息通道

key的过期监听,其实就是发布了一个消息通道,一旦有key过期了,就会把该key推送出去。当然,在该通道发布之前,我们就必须进行订阅。

这个key过期发布的通道,redis有提供一个专门打开的开关,在redis.conf里进行配置:

(当然,我们也可以自己发布其他消息通道)

默认是不打开(打开对CUP有消耗):

notify-keyspace-events ""
打开后:
notify-keyspace-events "Ex"

然后重启redis服务,就可以生效。

打开这个key过期发布的消息通道后,我们就编写程序该通道进行订阅

②订阅key过期消息通道

基于springBoot,一启动就进行订阅key过期消息通道,新建一个类,并注解@Component,并且实现CommandLineRunner接口,这样当spring容器加载完之后,就会马上执行该组件

@Component
public class RedisSubscribeThread implements CommandLineRunner {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @Autowired
    private OrderMasterRepository orderMasterRepository;
    @Autowired
    private ItemService itemService;
    @Autowired
    private OrderService orderService;
    @Override
    public void run(String... strings) throws Exception {
        redisTemplate.execute(new RedisCallback() {
            @Override
            public Object doInRedis(RedisConnection connection) throws DataAccessException {
                connection.pSubscribe(new MessageListener() {
                    @Override
                    public void onMessage(Message message, byte[] pattern) {
                        try {

                        Optional<OrderMaster> byId = orderMasterRepository.findById(message.toString());
                        OrderMaster orderMaster = byId.get();
                        if(orderMaster.getStatus()==0)
                        {
                            orderMaster.setStatus(5);
                            orderMaster.setCloseTime(new Date());
                            orderMaster.setUpdateTime(new Date());
                            orderMasterRepository.save(orderMaster);
                            OrderDTO orderDetailByOrderId = orderService.findOrderDetailByOrderId(message.toString());
                            for (OrderItem orderItem:
                                 orderDetailByOrderId.getOrderItemList()) {
                                itemService.increaseItemNum(orderItem.getItemId(),orderItem.getNumber());
                            }

                        }

                        }catch (Exception e)
                        {
                             e.printStackTrace();
                        }


                    }
                },"*@0*".getBytes());
                return null;
            }
        });
    }

}

 

 

1.6 redis设置后台启动

1、设置redis.conf中daemonize为yes,确保守护进程开启。

2、编写开机自启动脚本

vi /etc/init.d/redis
#!/bin/bash  
#chkconfig: 2345 80 90  
# Simple Redis init.d script conceived to work on Linux systems  
# as it does use of the /proc filesystem.    
# Simple Redis init.d script conceived to work on Linux systems  
# as it does use of the /proc filesystem.  

PATH=/usr/local/redis/bin:/sbin:/usr/bin:/bin   
REDISPORT=6379  
# 自己的redis-server路径(需要自己更改)
EXEC=/usr/local/redis/bin/redis-server   
REDIS_CLI=/usr/local/redis/bin/redis-cli   

PIDFILE=/var/run/redis.pid
# 自己的redis.conf 路径(需要自己更改)
CONF="/usr/local/redis/bin/redis.conf"  
AUTH=""  

case "$1" in   
        start)   
                if [ -f $PIDFILE ]   
                then   
                        echo "$PIDFILE exists, process is already running or crashed."  
                else  
                        echo "Starting Redis server..."  
                        $EXEC $CONF   
                fi   
                if [ "$?"="0" ]   
                then   
                        echo "Redis is running..."  
                fi   
                ;;   
        stop)   
                if [ ! -f $PIDFILE ]   
                then   
                        echo "$PIDFILE exists, process is not running."  
                else  
                        PID=$(cat $PIDFILE)   
                        echo "Stopping..."  
                       $REDIS_CLI -p $REDISPORT  SHUTDOWN    
                        sleep 2  
                       while [ -x $PIDFILE ]   
                       do  
                                echo "Waiting for Redis to shutdown..."  
                               sleep 1  
                        done   
                        echo "Redis stopped"  
                fi   
                ;;   
        restart|force-reload)   
                ${0} stop   
                ${0} start   
                ;;   
        *)   
               echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2  
                exit 1  
esac

 

3、写完后保存退出VI

4、设置权限

cd /etc/init.d/

chmod 755 redis

5、启动测试

/etc/init.d/redis start

设置开机自启动

chkconfig redis on

 

2  Redis的持久化方案

Redis的所有数据都是保存到内存中的。

Rdb:快照形式,定期把内存中当前时刻的数据保存到磁盘。Redis默认支持的持久化方案。

aof形式:append only file。把所有对redis数据库操作的命令,增删改操作的命令。保存到文件中。数据库恢复时把所有的命令执行一遍即可。

 

在redis.conf配置文件中配置。

Rdb:

redis crontab用法 redis -c_持久化_02

Aof的配置:

redis crontab用法 redis -c_redis crontab用法_03

两种持久化方案同时开启使用aof文件来恢复数据库。

 

 

 

3 redis安装遇到的问题

  1. (1)若出现如下提示,则说明未安装gcc,使用命令安装gcc:apt-get install gcc
[root@localhost redis-2.8.17]# make
cd src && make
allmake[1]: Entering directory `/root/redis-2.8.17/src‘
CC adlist.o
/bin/sh:cc: command not found
make[1]: *** [adlist.o] Error127
make[1]: Leaving directory `/root/redis-2.8.17/src‘
make: *** [all] Error2

(2)若出现如下提示,则将make改为make MALLOC=libc,推测是因为编译库的问题。

[root@localhost redis-2.8.17]#make
cd src && make all
make[1]: Entering directory `/root/redis-2.8.17/src‘
CC adlist.o
In file included from adlist.c:34:0:
zmalloc.h:50:31: error: jemalloc/jemalloc.h: No suchfileor directory
zmalloc.h:55:2: error:#error"Newer version of jemalloc required"
make[1]: *** [adlist.o] Error1
make[1]: Leaving directory `/root/redis-2.8.17/src‘
make: *** [all] Error2