1、Redis 是完全开源免费的,遵守 BSD 协议,是一个高性能的 key-value 数据库。
2、Redis 与其他 key - value 缓存产品有以下三个特点:
(1)Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
(2)Redis 不仅仅支持简单的 key-value 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储。
(3)Redis 支持数据的备份,即 master-slave 模式的数据备份。
3、Redis 优势
(1)性能极高 – Redis 能读的速度是 110000 次/s,写的速度是 81000 次/s 。
(2)丰富的数据类型 – Redis 支持二进制案例的 Strings, Lists, Hashes, Sets 及Ordered Sets 数据类型操作。
(3)丰富的特性 – Redis 还支持 publish/subscribe, 通知, key 过期等等特性。
1、进入官网下载
2、将安装包上传到服务器上的路径下,进行解压 tar -zxvf redis-5.0.14.tar.gz,会解压出一个文件夹 redis-5.0.14
drwxrwxr-x 6 root root 4096 Jan 8 10:19 redis-5.0.14
-rw-r--r-- 1 root root 2000179 Jan 8 09:49 redis-5.0.14.tar.gz
3、进入到 redis-5.0.14 目录下执行make编译,等待编译结束
[root@hhhh redis-5.0.14]# make
4、进入到 redis-5.0.14 目录下执行make install 安装
[root@hhhh redis-5.0.14]# make install
正常情况如果没有出现异常,单机版本的Redis就安装结束了
5、下面列出我在安装中遇到的2种异常,比较常见、记录一下其对应解决方法
(1)make install 出错/bin/sh: cc: command not found ,
[root@hhhh redis-5.0.14]# make install
cd src && make install
make[1]: Entering directory `/cloud/redis/redis-5.0.14/src'
CC Makefile.dep
make[1]: Leaving directory `/cloud/redis/redis-5.0.14/src'
make[1]: Entering directory `/cloud/redis/redis-5.0.14/src'
CC adlist.o
/bin/sh: cc: command not found
解决方式:执行 yum install gcc gcc-c++
(2)第二个错误
[root@hhhh redis-5.0.14]# make install
cd src && make install
make[1]: Entering directory `/cloud/redis/redis-5.0.14/src'
CC adlist.o
In file included from adlist.c:34:0:
zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory
#include <jemalloc/jemalloc.h>
^
compilation terminated.
make[1]: *** [adlist.o] Error 1
make[1]: Leaving directory `/cloud/redis/redis-5.0.14/src'
make: *** [install] Error 2
错误原因是jemalloc重载了Linux下的ANSI C的malloc和free函数
解决方式:make MALLOC=libc
1、修改redis.conf文件(redis.conf文件非常重要,这里先简单介绍一下当下用得着的几个配置,后续详细说明)
修改配置文件之前要养成备份的好习惯
默认是只能本机连接操作redis.配置允许所有ip都可以访问redis,在bind 127.0.0.1前加“#”将其注释掉
默认为保护模式,把 protected-mode yes 改为 protected-mode no
redis启动默认为不守护进程模式,窗口关闭,就会停止进程。把daemonize no 修改为daemonize yes,这样redis就可以后台执行
具体配置如下:
#bind 127.0.0.1
daemonize yes
requirepass pass
2、启动程序,指定配置文件启动Redis程序
[root@hhhh src]# ./redis-server ../redis.conf
3、不出意外,到这里程序已经正常启动了,查看进程
[root@hhhh src]# ps -ef |grep redis
root 2437 1 0 10:19 ? 00:00:00 ./redis-server *:6379
root 2442 1324 0 10:19 pts/0 00:00:00 grep --color=auto redis
4、客户端连接Redis
[root@hhhh src]# pwd
/cloud/redis/redis-5.0.14/src
[root@hhhh src]# ./redis-cli
127.0.0.1:6379>
至此单机版Redis安装部署启动成功,赶紧去冲学习常用的api命令吧
API使用教程参考:菜鸟教程Redis的使用 对新手非常nice
String 字符串、Hash 散列、List 列表、Set 集合、ZSet 有序集合
(1)常用API
序号 | 命令 | 说明 |
---|---|---|
1 | set key value | 设置指定 key 的值 |
2 | get key | 获取指定 key 的值 |
3 | mset key value [key value …] | 同时设置一个或多个 key-value 对。 |
4 | mget key1 [key2…] | 获取所有(一个或多个)给定 key 的值。 |
5 | setnx key value | 只有在 key 不存在时设置 key 的值。常用于实现分布式锁 |
6 | setex key seconds value | 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。 设置过期时间,是为了更好的利用redis的内存 |
7 | incr key | 将 key 中储存的数字值+1。 |
8 | incrby key increment | 将 key 所储存的值加上给定的增量值 |
还要一些命令 GETBIT 、SETBIT 等直接操作位的(先不进行介绍)
hash< key field1 value1 [field2 value2 ]>
//如下java种的hashmap:相当于 myHashMap 是key; caocao、xunxu、xuchu是field; 主公、谋士、保镖是对应的value
Map<String,String> myHashMap = new HashMap<>();
myHashMap.put("caocao","主公");
myHashMap.put("xunxu","谋士");
myHashMap.put("xuchu","保镖");
(1)常用api
序号 | 命令 | 说明 |
---|---|---|
1 | hsetkey field value | 将哈希表 key 中的字段 field 的值设为 value |
2 | hget key field | 获取存储在哈希表中指定字段的值 |
3 | hmset key field1 [field2] | 获取所有给定字段的值 |
4 | hmget key field1 value1 [field2 value2 ] | 同时将多个 field-value (域-值)对设置到哈希表 key 中 |
5 | hgetall key | 获取在哈希表中指定 key 的所有字段和值 |
6 | hkeys key | 获取所有哈希表中的字段 |
7 | hvals key | 获取哈希表中所有值 |
8 | hlen key | 获取哈希表中字段的数量 |
9 | hdel key field1 [field2] | 删除一个或多个哈希表字段 |
10 | hexists key field | 查看哈希表 key 中,指定的字段是否存在。 |
11 | hscan key cursor [MATCH pattern] [COUNT count] | 迭代哈希表中的键值对(当hash中的字段比较多的时候,如果需要全部进行遍历 则需要用这个命令,否则的话由于redis是单线程,会造成Redis的阻塞) |
hscan 的长度count失效场景分析
类似于java中的set几何
序号 | 命令 | 说明 |
---|---|---|
1 | sadd key member1 [member2] | 向集合添加一个或多个成员 |
2 | srem key member1 [member2] | 移除集合中一个或多个成员 |
3 | smembers key | 获取集合的成员数 |
4 | scard key | 同时将多个 field-value (域-值)对设置到哈希表 key 中 |
5 | sismember key member | 判断 member 元素是否是集合 key 的成员 |
5 | sinterstore destination key1 [key2] | 返回给定所有集合的交集并存储在 destination 中 |
7 | sunionstore destination key1 [key2] | 所有给定集合的并集存储在 destination 集合中 |
8 | sdiffstore destination key1 [key2] | 返回给定所有集合的差集并存储在 destination 中 |
9 | srandmember key [count] | 返回集合中一个或多个随机数(可以实现发牌功能) |
等同于java种的List
序号 | 命令 | 说明 |
---|---|---|
1 | lpush key value1 [value2] | 将一个或多个值插入到列表头部 |
2 | rpush key value1 [value2] | 在列表中添加一个或多个值 |
3 | linsert key BEFORE|AFTER pivot value | 在列表的元素前或者后插入元素 |
4 | lset key index value | 通过索引设置列表元素的值 |
5 | lpop key | 移出并获取列表的第一个元素 |
6 | rpop key | 移除列表的最后一个元素,返回值为移除的元素。 |
7 | lrem key count value | 移除列表元素 |
8 | ltrim key start stop | 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素 都将被删除。 |
9 | lindex key index | 通过索引获取列表中的元素 |
10 | lrange key start stop | 获取列表指定范围内的元素 |
11 | llen key | 获取列表长度 |
(1)zset的常用API
序号 | 命令 | 说明 |
---|---|---|
1 | zadd key score1 member1 [score2 member2] | 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
2 | zincrby key increment member | 有序集合中对指定成员的分数加上增量 increment |
3 | zrem key member [member …] | 移除有序集合中的一个或多个成员 |
4 | zrange key start stop [WITHSCORES] | 通过索引区间返回有序集合指定区间内的成员 |
5 | zrevrange key start stop [WITHSCORES] | 返回有序集中指定区间内的成员,通过索引,分数从高到低 |
6 | zrangebyscore key max min [WITHSCORES] | 通过分数返回有序集合指定区间内的成员 |
7 | zrevrangebyscore key max min [WITHSCORES] | 返回有序集中指定分数区间内的成员,分数从高到低排序 |
8 | zrank key member | 返回有序集合中指定成员的索引 |
9 | zrevrank key member | 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序 |
10 | zcount key min max | 计算在有序集合中指定区间分数的成员数 |
11 | zcard key | 获取有序集合的成员数 |
(2) 由于zset 很重要,java中又没有对应的数据结构类型,特举一个实际案例如下
根据当前百度热搜,采用zset缓存实现的一个具体案例
## 模拟在Redis中添加一个,一个热点新闻的key hotnews
## 1、演示zadd 指令,向缓存中添加热点新闻
127.0.0.1:6379> zadd hotnews 4980000 "数读十九届六中全会精神" 4860000 "国家卫健委回应西安孕妇流产等事件" 4770000 "各地贯彻十九届六中全会精神纪实" 4620000 "中央巡视组刚走 “金融虎”就落马" 4590000 "哈萨克斯坦前总理涉嫌叛国罪被捕" 4440000 "广西近百鸵鸟“越狱”街头狂奔"
(integer) 6
## 2、演示zincrby 指令,
## 某一个时刻有十个用户点击了 "各地贯彻十九届六中全会精神纪实" 这条新闻,则将其热度+10
127.0.0.1:6379> zincrby hotnews 10 "各地贯彻十九届六中全会精神纪实"
"4770010"
## 3、演示zrevrange 指令
## 演示获取当前最热点的三条新闻,根据分数值从高到低排序
127.0.0.1:6379> zrevrange hotnews 0 2 withscores
数读十九届六中全会精神
4980000
国家卫健委回应西安孕妇流产等事件
4860000
各地贯彻十九届六中全会精神纪实
4770010
## 4、演示zrange 指令
## 演示获取当前最 不 热点的三条新闻,根据分数值从低到高排序
127.0.0.1:6379> zrange hotnews 0 2 withscores
广西近百鸵鸟“越狱”街头狂奔
4440000
哈萨克斯坦前总理涉嫌叛国罪被捕
4590000
中央巡视组刚走 “金融虎”就落马
4620000
## 5、演示zrangebyscore 指令
## 演示获取从低到高获取热度从4500000 - 4800000之间的新闻数据
127.0.0.1:6379> zrangebyscore hotnews 4500000 4800000 withscores
哈萨克斯坦前总理涉嫌叛国罪被捕
4590000
中央巡视组刚走 “金融虎”就落马
4620000
各地贯彻十九届六中全会精神纪实
4770010
## 6、演示zrevrangebyscore 指令
## 演示获取从低到高获取热度从5000000 - 4800000之间的新闻数据
127.0.0.1:6379> zrevrangebyscore hotnews 5000000 4800000 withscores
数读十九届六中全会精神
4980000
国家卫健委回应西安孕妇流产等事件
4860000
## 7、演示zrank/zrevrank指令
## 按照降序获得 “各地贯彻十九届六中全会精神纪实” 新闻的热度排名
127.0.0.1:6379> zrevrank hotnews "数读十九届六中全会精神"
0
## 按照升序获得 “各地贯彻十九届六中全会精神纪实” 新闻的热度排名
127.0.0.1:6379> zrank hotnews "数读十九届六中全会精神"
5
如果出现中文乱码问题,客户端登陆redis的时候可以采用命令:./redis-cli --raw