详解Redis

Redis/缓存系统
433
0
0
2022-04-02
标签   Redis

REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统。Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

详解Redis

1.redis安装

(1) wget http://download.redis.io/releases/redis-6.0.3.tar.gz

下载成功

详解Redis

(2) tar zxvf redis-6.0.3.tar.gz

解压成功

详解Redis

(3) make

编译成功

(4) make install

详解Redis

(5) redis-server -v

测试

详解Redis

(6) redis-server

启动redis


详解Redis

(7) 在另外一个窗口,通过命令行关闭

详解Redis

就会观察这边会关闭掉redis server,正常关闭

详解Redis

以后台进程的方式启动reids,这种方式还是以前台进程的方式,启动的

(8) vim redis.conf

后台启动redis服务。把daemonize no改为daemonize yes。这个时候就以后台的方式启动。

详解Redis

改为

详解Redis

(9) ./src/redis-server redis.conf

这个时候就以后台方式启动

详解Redis

(10) redis的默认端口是6379

详解Redis

2.redis6.0多线程

(1) 如需开启需要修改 redis.conf 配置文件:io-threads-do-reads yes。

详解Redis

(2) Redis 6.0 多线程开启时,线程数如何设置?

开启多线程后,需要设置线程数,否则是不生效,需要修改redis.conf。

关于线程数的设置,官方有一个建议:4 核的机器建议设置为 2 或 3 个线程,8 核的建议设置为

6 个线程,线程数一定要小于机器核数。

3.基本数据结构

redis的key就以这些形式存在:

详解Redis

Redis 键命令用于管理 redis 的键。基本语法:

redis 127.0.0.1:6379> COMMAND KEY_NAME

redis 127.0.0.1:6379> SET www redis

OK

redis 127.0.0.1:6379> DEL www

(integer) 1

Redis Keys 命令:

详解Redis

详解Redis

String: 字符串

key value

name xxx

counter 1

bits 1 1 0 0 1 1 0 1 1

Redis 字符串数据类型的相关命令用于管理 redis 字符串值,基本语法如下:

redis 127.0.0.1:6379> COMMAND KEY_NAME

实例:

redis 127.0.0.1:6379> SET wwwkey redis

OK

redis 127.0.0.1:6379> GET wwwkey

"redis"

命令

Redis 字符串命令

详解Redis

详解Redis

详解Redis

应用举例

缓存图片

set redis-log.jpg redis-log-data

存储文章

用户写文章时,需要把文章标题,内容,作者,发表时间等信息存起来,并在用户阅读时读取这些信息。可使用mset mget msetnx命令来进行。

存储文章

被存储的内容 数据库中的键 键的值

文章的标题 article:10086:title ‘message’

文章的内容 article:10086:content ‘hello redis’

文章的作者 article:10086:author ‘xxx’

文章创建的时间戳 article:10086:create_a 'xxxx'

文章长度计数功能、文章摘要、文章计数

文章长度:STRLEN article:10086:content

文章摘要:GETRANGE article:10086:content 0 5

文章阅读计数:INCR article:10086:count

限速器

(1)防止网站内容被网络爬虫疯狂抓取,限制每个 ip 地址在固定的时间段内能够访问的页面数量,比如1 分钟最多只能访问 30 个页面。

(2) 防止用户的账号遭到暴力破解,如果同个账号连续好几次输入错误的密码,则限制账号的登录,只能等 30 分钟后再次登录,比如设置 3 次。

SET max:execute:times 3

密码出错时 DECR max:execute:times

当 max:execute:times 的值小于 0 时则禁止登录,并可以设置SETEX login:error:darren 1800 "Incorrect password",然后使用 TTL login:error:darren 1800 检测对应剩余的时间。

综上

字符串的值既可以存储文字数据,又可以存储二进制数据。

MSET/MGET 命令可以有效地减少程序的网络通信次数,从而提高程序的执行效率。

redis 用户可以定制命名格式来提升 redis 数据的可读性并避免键名冲突。

Hash: 散列表

Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。Re

dis 中每个 hash 可以存储 2的32次方- 1 键值对(40 多亿)。案例如下:

127.0.0.1:6379> hmset helloredis name "redis tutorial" likes 20 visitors 23000

OK

127.0.0.1:6379> hgetall helloredis

1) "name"

2) "redis tutorial"

3) "likes"

4) "20"

5) "visitors"

6) "23000"

Redis Hash 命令

详解Redis

详解Redis

哈希举例

短网址生成程序

详解Redis

可以根据该短链接查询到具体的源网址,并记录点击次数。

散列表重新实现文章存储

key field value

title ‘message’

article:10086 conten ‘hello world’

author ‘xxx’

create_at 'xxxxxx'

散列表和字符串

字符串命令与类似散列的命令

详解Redis

散列键的优点

通过key对应的字段和值进行存储。可以把任意多的字段和值存储到散列里面。

使用字符串键与散列存键储存相同数量的区别,红色的为string类型存储,绿色为散列存储的形式。

详解Redis

字符串键的优点

字符串键命令提供的操作比散列键命令更为丰富,如使用SETRANGE和GETRANGE命令设置或读取字符串值的其中一部分 ,使用APPEND命令把新内容追加到字符串值的末尾,但是散列键并不支持这些操作。

字符串键是可以为不同的字段设置过期时间,而散列键不会,当一个散列键过期的时候,它包含的所有字段和值都会被删除。而针对字符串键,用户可以为每个字符串键分别设置不同的过期时间,让它们根据实际的需要自动被删除。

字符串键和散列键的选型

散列资源占用少,字符串命令支持多,可以独立设置每个字段的过期时间。

详解Redis

适用场景对比:

1. 如果程序需要为单个数据项单独设置过期的时间,那么使用字符串键

2. 如果程序需要对数据项执行诸如 SETRANGE、GETRANGE 或者 APPEND 等操作,那么优先考虑使用字符串键。当然,用户也可以选择把数据存储在散列中,然后将类似 SETRANGE、GETRANGE 这样的操作交给客户端执行。

3.如果程序需要存储的数据项比较多,并且你希望尽可能地减少存储数据所需的内存,就应该优先考虑使用散列键。

4.多个数据项在逻辑上属于同一组或者同一类,那么应该优先考虑使用散列键。

List: 列表

Redis列表是简单字符串列表,可以把一个元素使用头插法或尾插法,一个列表最多包含2的32次方 -1 个元素,每个列表超过40亿个元素。

详解Redis

127.0.0.1:6379> lpush hellokey redis

(integer) 1

127.0.0.1:6379> lpush hellokey memcached

(integer) 2

127.0.0.1:6379> lpush hellokey mongodb

(integer) 3

127.0.0.1:6379> lpush hellokey mysql

(integer) 4

127.0.0.1:6379> lrange hellokey 0 10

1) "mysql"

2) "mongodb"

3) "memcached"

4) "redis"

list命令

Redis List 列表命令

详解Redis

详解Redis

应用举例

先进先出队列

秒杀活动

把用户的购买操作都放入先进先出队列里面,然后以队列方式处理用户的购买操作

分页功能

很多应用程序的分页功能也是很常见,如新闻站点、博客、论坛、搜索引擎等,使用分页程序将数量众多的信息分割为多个页面,使得用户可以以页为单位浏览网站提供的信息,并以此来控制网站每次取出的信息数量。注意,使用分页功能,数据最好不要修改。

Set集合

Set是String类型的无序集合,集合成员唯一,集合中不能有重复数据,集合是通过哈希表实现,所以添加,删除,查找的复杂度都是 O(1)。每个集合可存储 40 多亿个成员,与list一样。

127.0.0.1:6379> sadd hellokey redis

(integer) 1

127.0.0.1:6379> sadd hellokey mongodb

(integer) 1

127.0.0.1:6379> sadd hellokey mysql

(integer) 1

127.0.0.1:6379> sadd hellokey memcached

(integer) 1

127.0.0.1:6379> sadd hellokey memcached

(integer) 0

127.0.0.1:6379> smembers hellokey

1) "memcached"

2) "mysql"

3) "mongodb"

4) "redis"

Set命令

详解Redis

详解Redis

应用举例

唯一计数器

用户数量记录的是访问网站的 IP 地址数量,即使同一个 IP 地址多次访问相同的页面,用户数量计数器也只会对这个 IP 地址进行一次计数。需要构建一个新的计数器,可以用 SET 集合。

加入 IP:

SADD users:count 202.177.2.232

计算总数:

SCARD users:count

点赞

朋友圈点赞:

(1)点赞

sadd like:{消息 Id} {点赞用户 Id}

(2) 取消点赞

srem like:{消息 Id} {点赞用户 Id}

(3) 检查用户是否点过赞

sismember like:{消息 Id} {点赞用户 Id}

(4) 获取点赞用户列表

smembers like:{消息 Id}

(5) 获取点赞用户数量

scard like:{消息 Id}

共同关注和集合关注

集合操作

(1) 交集

sinter set1 set2 set3 -> {c}

(2) 并集

sunion set1 set2 set3 -> {a,b,c,d,e}

(3) 差集

sdiff set1 set2 set3 -> {a}

详解Redis

集合实现微博/微信关注模型。

投票

注重内容质量的网站上通常都会提供投票功能,用户可以通过投票来支持一项内容或者反对一项内容:获得的支持票数越多,就会被网站安排到越明显的位置,使得网站的用户可以更快速地浏览到高质量的内容。与此相反,一项内容获得的反对票数越多,它就会被网站安排到越不明显的位置,甚至被当作广告或者无用内容隐藏起来,使得用户可以忽略这些低质量的内容。相当于做了一个集合处理,把这些好的文章展现出来。

抽奖

微信抽奖小程序:

(1) 点击参与抽奖加入集合

sadd key {userId}

(2) 查看参与抽奖所有用户;

smembers key

(3) 抽取 n 名中奖者

srandmember key [n]

或 spop key [n]

详解Redis

Sorted Set: 有序集合

Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。同样可以存储超过40多亿个成员。

127.0.0.1:6379> zadd hellokey 1 redis

(integer) 1

127.0.0.1:6379> zadd hellokey 2 mongodb

(integer) 1

127.0.0.1:6379> zadd hellokey 3 memcached

(integer) 1

127.0.0.1:6379> zrange hellokey 0 10

1) "redis"

2) "mongodb"

3) "memcached"

127.0.0.1:6379> zadd hellokey 4 mysql

(integer) 1

127.0.0.1:6379> zrange hellokey 0 10 withscores

1) "redis"

2) "1"

3) "mongodb"

4) "2"

5) "memcached"

6) "3"

7) "mysql"

8) "4"

有序集合命令

详解Redis

详解Redis

详解Redis

应用举例

排行榜

实现热搜

(1) 点击新闻(今天热搜)

(2)热搜榜单统计

(3) 展示三天排行前 10

时间线

(1)博客系统会按照文章发布时间的先后,把最近发布的文章放在前面,而发布时间较早的文章则放在后面,这样访客在浏览博客的时候,就可以先阅读最新的文章,然后再阅读较早的文章。

(2) 新闻网站会按照新闻的发布时间,把最近发生的新闻放在网站的前面,而早前发生的新闻则放在网站的后面,这样当用户访问该网站的时候,就可以第一时间查看到最新的新闻报道。

(3) 如微博和 Twitter 这样的微博客都会把用户最新发布的消息放在页面的前面,而稍早之前发布的消息则放在页面的后面,这样用户就可以通过向后滚动网页,查看最近一段时间自己关注的人都发表了哪些动态。

4.操作命令

Redis HyperLogLog 是用来做基数统计的算法,优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的并且是很小的。Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。注意它只是计算基数,而不存储。

127.0.0.1:6379> pfadd hellofkey "redis"

(integer) 1

127.0.0.1:6379> pfadd hellofkey "mongodb"

(integer) 1

127.0.0.1:6379> pfadd hellofkey "mysql"

(integer) 1

127.0.0.1:6379> pfcount hellofkey

(integer) 3

HyperLogLog 命令:

详解Redis

5.发布订阅

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

客户端可以订阅任意数量的频道。下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:

详解Redis

当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客

户端:

详解Redis

实例:在我们实例中我们创建了订阅频道名为 redisChat:

Subscribe 客户端 1

127.0.0.1:6379> subscribe redisChat

Reading messages... (press Ctrl-C to quit)

1) "subscribe"

2) "redisChat"

3) (integer) 1

1) "message"

2) "redisChat"

3) "Redis is a great caching technique"

1) "message"

2) "redisChat"

3) "Think you"

另外开启一个 redis 客户端,Subscribe 客户端 2

127.0.0.1:6379> subscribe redisChat

Reading messages... (press Ctrl-C to quit)

1) "subscribe"

2) "redisChat"

3) (integer) 1

1) "message"

2) "redisChat"

3) "Think you"

开启 Publish 客户端

127.0.0.1:6379> publish redisChat "Redis is a great caching technique"

(integer) 1

127.0.0.1:6379> publish redisChat "Think you"

(integer) 2

127.0.0.1:6379>

这样两个客户端就能够接收到数据了。

发布订阅命令

详解Redis

应用举例

发布订阅与list消息队列区别:

(1)list通过key队列方式实现,取出删掉,其它进程没办法取到,会阻塞进程。订阅发布可以支持多客户端获取同一频道发布的信息。

(2) list不处理消息,会缓存在列表,而发布订阅不处理就丢失了,不会缓存了。

6.Redis事务

Redis 事务可以一次执行多个命令, 并具有以下三个重要的特点:

(1) 批量操作的命令放在队列缓存中

(2) 收到EXEC命令后进入事务执行,事务中某一条命令执行失败,其它命令依然被执行。

(3) 在事务执行过程中,其它客户端提交的命令请求不会插入到事务执行命令序列中。

一个事务从开始到执行会经历三个步骤:

(1) 开始事务

(2) 命令入队

(3) 执行事务

127.0.0.1:6379> multi

OK

127.0.0.1:6379> set bookname "mastering c++"

QUEUED

127.0.0.1:6379> set bookname "hello class"

QUEUED

127.0.0.1:6379> get bookname

QUEUED

127.0.0.1:6379> sadd tag "c++" "Programming" "Mastering Serires"

QUEUED

127.0.0.1:6379> smembers tag

QUEUED

127.0.0.1:6379> exec

1) OK

2) OK

3) "hello class"

4) (integer) 3

5) 1) "c++"

2) "Mastering Serires"

3) "Programming"

127.0.0.1:6379>

命令

redis 事务的相关命令:

详解Redis

需要注意的是,事务在执行时会独占服务器,所以用户应该避免在事务中执行过多命令,特别是有大量计算的命令,以免造成服务器阻塞。

Redis 脚本使用 Lua 解释器来执行脚本。通过内嵌支持 Lua 环境。执行脚本的常用命令为 EVAL。

Eval 命令的基本语法如下:

redis 127.0.0.1:6379> EVAL script numkeys key [key ...] arg [arg ...]

如下面这样:

redis 127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first seco

nd

1) "key1"

2) "key2"

3) "first"

4) "second"

下表列出了 redis 脚本常用命令:

详解Redis

详解Redis

Redis 安全

通过 redis 的配置文件设置密码参数,这样客户端连接到 redis 服务就需要密码验证,这样可以让你的 redis 服务更安全。

可以通过以下命令查看是否设置了密码验证:

127.0.0.1:6379> CONFIG get requirepass

1) "requirepass"

2) ""

默认情况下 requirepass 参数是空的,这就意味着你无需通过密码验证就可以连接到 redis 服务。

你可以通过以下命令来修改该参数:

127.0.0.1:6379> CONFIG set requirepass "hello"

OK

127.0.0.1:6379> CONFIG get requirepass

1) "requirepass"

2) "hello"

设置密码后,客户端连接 redis 服务就需要密码验证,否则无法执行命令。

AUTH 命令基本语法格式如下:

127.0.0.1:6379> AUTH password

127.0.0.1:6379> AUTH "xxx"

OK

127.0.0.1:6379> SET xxx "Test value"

OK

127.0.0.1:6379> GET mykey

"Test value"

Redis 数据备份与恢复

Redis SAVE 命令用于创建当前数据库的备份。

127.0.0.1:6379> SAVE

OK

将在 redis 安装目录中创建 dump.rdb 文件(具体目录执行命令:CONFIG GET dir 获取)。

save命令是把所有数据库的所有键值对全部记录到RDB文件中,在SAVE命令,执行期间,Redis服务器将阻塞,直到RDB文件创建完为止。如果Redis服务器在执行SAVE命令时,已经存在了相应的RDB,那服务器将使用新创建的RDB文件代替已有的RDB文件。

详解Redis

详解Redis

恢复数据

将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可。获取redis 目录可以使用 CONFIG 命令,如下所示:

127.0.0.1:6379> CONFIG GET dir

1) "dir"

2) "/usr/local/redis/bin"

以上命令 CONFIG GET dir 输出的 redis 安装目录为 /usr/local/redis/bin。

可以使用非阻塞方式创建RDB,创建 redis 备份文件也可以使用命令 BGSAVE,该命令在后台执行。

127.0.0.1:6379> BGSAVE

Background saving started

还可以设置save选项,当Redis服务器满足条件时,自动执行BGSAVE命令:

save <seconds> <changes>

如果服务器在 seconds 秒之内,对其包含的各个数据库总共执行了至少 changes 次修改,那么服务器将自动执行一次 BGSAVE 命令。

如save 60 10000

当“服务器在 60s 秒之内至少执行了 10000 次修改”这一条件被满足时,服务器就会自动执行一次 BGSAVE 命令。

还可以同时设置多个SAVE选项:

save 6000 1

save 600 100

save 60 10000

当以下任意一个条件被满足时,服务器就会执行一次 BGSAVE 命令:

·在 6000s(100min)之内,服务器对数据库执行了至少 1 次修改。

·在 600s(10min)之内,服务器对数据库执行了至少 100 次修改。

·在 60s(1min)之内,服务器对数据库执行了至少 10000 次修改。

当有多个触发条件导致服务器频繁执行BGSAVE命令,负责自动触发BGSAVE命令的时间计数器以及修改次数计数器都会被清0,并重新开始计数。不管这个命令是SAVE,BGSAVE,还是自动触发的BGSAVE命令创建。

SAVE 与BGSAVE

为了防止save命令带来的阻塞,只能使用BGSAVE命令来创建RDB文件。

由于SAVE命令没有创建子进程,不会因为创建子进程而消耗内存,所以使用save命令能够比BGSAVE 命令更快完成创建RDb文件的工作。

7.Redis 性能测试

redis 性能测试的基本命令如下:

redis-benchmark [option] [option value]

注意:该命令是在 redis 的目录下执行的,而不是 redis 客户端的内部指令。

以下实例同时执行 10000 个请求来检测性能

$ ./redis-benchmark -n 10000 -q

PING_INLINE: 78740.16 requests per second

PING_BULK: 76335.88 requests per second

SET: 77519.38 requests per second

GET: 83333.34 requests per second

INCR: 84033.61 requests per second

LPUSH: 70422.53 requests per second

RPUSH: 80000.00 requests per second

LPOP: 76923.08 requests per second

RPOP: 85470.09 requests per second

SADD: 78125.00 requests per second

HSET: 86206.90 requests per second

SPOP: 80000.00 requests per second

LPUSH (needed to benchmark LRANGE): 78740.16 requests per second

LRANGE_100 (first 100 elements): 71942.45 requests per second

LRANGE_300 (first 300 elements): 81967.21 requests per second

LRANGE_500 (first 450 elements): 83333.34 requests per second

LRANGE_600 (first 600 elements): 83333.34 requests per second

MSET (10 keys): 64102.56 requests per second

redis 性能测试工具可选参数如下所示:

详解Redis

详解Redis

8.客户端连接

Redis通过监听TCP端口,接收客户端连接,当连接建立后,Redis内部会进行以下操作:

(1)客户端被设置为非阻塞方式,因为Redis采用的就是非阻塞多路复用模型。

(2)为这个 socket 设置 TCP_NODELAY 属性,禁用 Nagle 算法。

(3)创建一个可读的文件事件用于监听这个客户端 socket 的数据发送。

最大连接数是放在redis.conf进行配置,maxclients 的默认值是 10000。

config get maxclients

1) "maxclients"

2) "10000"

以下实例我们在服务启动时设置最大连接数为 100000:

redis-server --maxclients 100000

客户端命令:

详解Redis

9.管道技术

Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应。管道相当于一个缓存队列。

查看 redis 管道,只需要启动 redis 实例并输入以下命令:

$(echo -en "PING\r\n SET kingkey redis\r\nGET kingkey\r\nINCR visitor\r\nINCR visitor\r\nINC

R visitor\r\n"; sleep 10) | nc localhost 6379

+PONG

+OK

redis

:1

:2

:3

通过使用 PING 命令查看 redis 服务是否可用, 之后我们设置了 kingkey 的值为 redis,然后我们获取 kingkey 的值并使得 visitor 自增 3 次。在返回的结果中我们可以看到这些命令一次性向 redis 服务提交,并最终一次性读取所有服务端的响应。管道技术最显著的优势是提高了 redis 服务的性能。

10.Redis 分区

分区是分割数据到多个 Redis 实例的处理过程,因此每个实例只保存 key 的一个子集。

优点:

利用多台计算机内存,构造更大数据库

通过多核和多台计算机,允许扩展计算能力,通过多台计算机的网络适配器,允许扩展网络带宽。

缺点:

(1)多个key的操作通常不支持,当两个set映射到不同的redis实例上,不能对这两个set执行交集操作。

(2)多个 key 的 redis 事务不能使用。

(3)当使用分区时,数据处理较为复杂,比如你需要处理多个 rdb/aof 文件,并且从多个实例和主机备份持久化文件。

(4) 增加或删除容量也比较复杂。redis 集群大多数支持在运行时增加、删除节点的透明数据平衡的能力,但是类似于客户端分区、代理等其他系统则不支持这项特性。

范围分区

最简单的分区方式是按范围分区,就是映射一定范围的对象到特定的 Redis 实例。

如,ID 从 0 到 10000 的用户会保存到实例 R0,ID 从 10001 到 20000 的用户会保存到 R1,以此类推。这种方式是可行的,并且在实际中使用。

不足就是要有个区间范围到实例的映射表,这个表要被管理,同时还要各种对象的映射表。所以要看需求。

哈希分区

hash 分区对任何 key 都适用,也无需是 object_name:这种形式,像下面描述的一样简单。

(1) 用一个 hash 函数将 key 转换为一个数字,比如使用 crc32 hash 函数。对 key foobar 执行 crc32(foobar)会输出类似 93024922 的整数。

(2) 对这个整数取模,将其转化为 0-3 之间的数字,就可以将这个整数映射到 4 个 Redis 实例中的一个了。93024922 % 4 = 2,就是说 key foobar 应该被存到 R2 实例中。

11.C语言使用Redis

进入 redis-6.0.3/deps/hiredis

$ make
$ sudo make install
mkdir -p /usr/local/include/hiredis /usr/local/include/hiredis/adapters /usr/local/lib
cp -pPR hiredis.h async.h read.h sds.h /usr/local/include/hiredis
cp -pPR adapters/*.h /usr/local/include/hiredis/adapters
cp -pPR libhiredis.so /usr/local/lib/libhiredis.so.0.14
cd /usr/local/lib && ln -sf libhiredis.so.0.14 libhiredis.so
cp -pPR libhiredis.a /usr/local/lib
mkdir -p /usr/local/lib/pkgconfig
cp -pPR hiredis.pc /usr/local/lib/pkgconfig

连接 Redis 服务

// 连接 Redis 服务
redisContext *context = redisConnect("127.0.0.1", 6379);
if (context == NULL || context->err) {
  if (context) {
    printf("%s\n", context->errstr);
} else {
    printf("redisConnect error\n");

}

exit(EXIT_FAILURE);

授权 Auth

redisReply *reply = redisCommand(context, "auth 0voice");
 printf("type : %d\n", reply->type);
 if (reply->type == REDIS_REPLY_STATUS) {
   /*SET str Hello World*/ 
   printf("auth ok\n");
 }
 freeReplyObject(reply);

Set Key Value

har *key = "str";
char *val = "Hello World";
/*SET key value */ 
reply = redisCommand(context, "SET %s %s", key, val);
printf("type : %d\n", reply->type);
if (reply->type == REDIS_REPLY_STATUS) {
  /*SET str Hello World*/ 
  printf("SET %s %s\n", key, val);
}
freeReplyObject(reply);

Get Key

// GET Key
 reply = redisCommand(context, "GET %s", key);
 if (reply->type == REDIS_REPLY_STRING) {
   /*GET str Hello World*/ 
   printf("GET str %s\n", reply->str);
   /*GET len 11*/ 
   printf("GET len %ld\n", reply->len);
 }
 freeReplyObject(reply);

APPEND Key Value

// APPEND key value 
 char *append = " I am your GOD";
 reply = redisCommand(context, "APPEND %s %s", key, append);
 if (reply->type == REDIS_REPLY_INTEGER) {
   printf("APPEND %s %s \n", key, append);
 }
 freeReplyObject(reply);
 /*GET key*/ 
 reply = redisCommand(context, "GET %s", key);
 if (reply->type == REDIS_REPLY_STRING) {
   //GET Hello World I am your GOD 
   printf("GET %s\n", reply->str);
 }
 freeReplyObject(reply);