0%

Redis简介

Redis 是一个key-value存储系统,本文主要记录Redis的安装、配置、数据类型、基本操作以及相关概念。

Redis(Remote Dictionary Server)是一个开源的高性能key-value数据库,它以字典结构存储数据,并允许其他应用通过TCP协议进行读取。Redis的数据都存储在内存中,因此在性能上相比较于硬盘存储的数据库有非常明显的优势。

1. Redis的安装

1.1 Windows平台

官网的Redis只有Linux版本的,但是Github上有Windows版的Redis【下载地址】。Windows的Redis有msi安装版,压缩包版和源码编译三种使用方式。

Redis的目录下主要有两类文件:应用文件和配置文件。

文件名 文件功能
redis-server 服务端应用,提供Redis服务
redis-cli 客户端程序,通过连接Redis服务并进行操作
redis-benchmark 性能测试,用来模拟同时由N个客户端发送M个SETs/GETs操作
redis-check-aof 更新日志检查
redis-check-dump 本地数据库检查
redis.windows.conf 配置文件,将Redis作为普通软件使用,命令行关闭则Redis关闭
redis.windows-service.conf 配置文件,将Redis作为系统服务进行配置

2. 配置和使用

2.1 服务端命令

Redis安装完成后需要进行启动才能使用,打开命令行,输入redis-server redis.windows.conf命令,即可启动Redis服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
C:\Redis>redis-server redis.windows.conf
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 3.2.100 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 6660
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'

[6660] 12 Oct 11:17:05.019 # Server started, Redis version 3.2.100
[6660] 12 Oct 11:17:05.028 * DB loaded from disk: 0.007 seconds
[6660] 12 Oct 11:17:05.029 * The server is now ready to accept connections on port 6379

可以看到Redis已经打开了,使用这种方式的缺点是不能关闭命令行,否则Redis服务就会关闭。如果要开机启动Redis服务,需要将Redis安装成Windows服务。

1
2
3
4
5
6
7
8
# 安装服务
redis-server --service-install redis.windows.conf
# 启动服务
redis-server --service-start
# 停止服务
redis-server --service-stop
# 卸载服务
redis-server --service-uninstall

两种启动服务的方式根据个人喜好,或者基于开发环境或生产环境进行选择。

2.2 客户端命令

另外打开一个命令行窗口,输入客户端使用命令redis-cli -h host -p port -a password就可以连接到Redis服务,host默认为127.0.0.1,port默认为6379

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 连接数据库服务
C:\Redis>redis-cli -h 127.0.0.1 -p 6379 #命令行输入
127.0.0.1:6379>
# 写入数据
127.0.0.1:6379> set key value
# 查询数据
127.0.0.1:6379> get key
# 判断是否存在
127.0.0.1:6379> exists key
# 删除
127.0.0.1:6379> del key
# 查询数据类型
127.0.0.1:6379> type key
# 关闭Redis服务
127.0.0.1:6379> shutdown
# 数据库选择
127.0.0.1:6379> select db_num

2.3 Redis配置文件属性

Redis配置文件中可以对数据库的属性进行配置,常用的配置参数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
################################## NETWORK #####################################
#默认ip地址
bind 127.0.0.1
#Redis默认监听端口
port 6379
#客户端闲置多少秒后断开连接
timeout 0
################################# GENERAL #####################################
#是否作为守护进程运行,windows下不支持该属性
daemonize no
#日志显示级别
loglevel notice
#指定日志输出的文件名,默认输出到标准输出端口
logfile ""
#默认支持的数据库的数量
databases 16
################################ SNAPSHOTTING ################################
#持久化策略save <seconds> <changes>
save 100 1 #当有一条数据被改变时,900s刷新到disk一次
save 300 10 #当有10条数据被改变时,300s刷新到disk一次
save 60 10000 #当有10000条数据被改变,60s刷新到disk一次
#持久化数据保存的文件名
dbfilename dump.db
#持久化数据保存的路径
dir ./
################################# REPLICATION #################################
#主从配置,设置该数据库为其他的从数据库
slaveof <masterip> <masterport>
#主服务器连接时需要的密码
masterauth <master-password>
################################## SECURITY ###################################
#设置连接密码
requirepass <password>
################################### LIMITS ####################################
#最大客户连接数
maxclients 10000
#
persistence-available [(yes)|no]
#可使用的最大最大内存
maxmemory <bytes>
############################## APPEND ONLY MODE ###############################
#是否开启日志功能
appendonly no
#AOF持久化策略
appendfsync [always|everysec|no]

3. Redis数据浏览器

RedisClient这个工具是Redis的客户端,专门用来浏览当前Redis中的所有数据。省去了查询Redis里面有哪些数据还需要输入命令行的繁琐和不便利。
RedisClient可以直接在Github上进行下载,支持Windows、Linux和MacOS。操作简单,功能也很全,Github仓库里有详细的使用说明,非安装版使用命令java -jar redisclient-win32.x86_64.2.0.jar

4. Redis编程

4.1 Python

Python使用Redis非常简单,可以通过pip install redis在环境中安装编程需要的API。下面是一个简单的实例,利用Redis存储数值、字符串和图像。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import cv2

import redis
import struct
import numpy as np

def toRedis(array):
'''
Encode ndarry 'array' to bytes
'''
# 1. get shape of Numpy array and encode
h,w = array.shape
shape = struct.pack('>II',h,w) # '>'表示大端,'I'表示4个字节的unsigned int,'II'表示8字节的unsigned int
# 2. append the Numpy array as bytes to the shape
encode = shape+array.tobytes()
return encode
def fromRedis(encode):
# 4. extract the shape of the Numpy array from the string
h,w = struct.unpack('>II',encode[:8])
# extract data and repopulate Numpy array, reshape to original shape
array = np.frombuffer(encode,dtype=np.uint8,offset=8).reshape(h,w)
return array

if __name__=='__main__':
r = redis.Redis(host='127.0.0.1',port=6379)
img = cv2.imread('./oil11_2.bmp',cv2.IMREAD_GRAYSCALE)

r.set('name','tangming')
r.set('age',5)
# 3. store the encoded array under supplied key
r.set('image',toRedis(img))

print(r.get('name'))
print(r.get('age'))
array = fromRedis(r.get('image'))
cv2.imshow('image',array)

4.2 C++

用C++来操作Redis数据库,需要另外的Redis客户端库,常用的有hiredisxrediscpp_redis。其中hiredis使用简单,函数少,最接近Redis原始命令。cpp_redis需要C++11编译器的支持。

参考文献 & 资源链接