redis基础知识
文章目录
- 1、redis安装
- 1.1、linux下 安装redis
- 1.2、将redis加入开机自动启动
- 1.3、将redis-cli加入环境变量
- 2、redis.conf配置文件
- 2.1、配置文件修改
- 2.2、配置文件参数说明
- 3、五大类型 指令
- 3.1、String
- 3.2、List
- 3.3、Set
- 3.4、哈希
- 3.5、有序集合
- 4、统计、事务、消息队列
- 4.1、HyperLogLog
- 4.2、消息通信
- 4.3、事务
- 4.4、脚本
- 4.5、其他指令
1、redis安装
windows下安装参考:https://www.runoob.com/redis/redis-install.html
redis:
1、它是 c语言编写的、可基于内存、可持久化、支持网络的Key-Value数据库。
2、它性能特别高、所有操作都是原子性的。
1.1、linux下 安装redis
这里我使用的是centos8,成功安装
下载
wget http://download.redis.io/releases/redis-6.0.8.tar.gz
更多的redis版本可以去这个网页查找:http://download.redis.io/releases
安装、启动
# 解压
tar -xzf redis-6.0.8.tar.gz
# 进入解压目录
cd redis-6.0.8
# 编译
make
# 编译后启动
cd src
./redis-server
# 也可以根据配置文件启动
./redis-server ../redis.conf
1.2、将redis加入开机自动启动
修改配置文件
# 先把redis安装到/usr/local/redis下
make install PREFIX=/usr/local/redis
# 复制配置文件到安装目录
cp ~/redis-6.0.8/redis.conf /usr/local/redis/bin/
# 修改配置文件
vi /usr/local/redis/bin/redis.conf
把daemonized后面改成yes
# 根据配置文件启动redis(在/usr/local/redis/bin目录下执行)
./redis-server redis.conf
# 查看redis进程
ps aux|grep redis
# 编写开机启动文件
vim /etc/init.d/redis
/etc/init.d/redis文件内容
#!/bin/bash
#
# chkconfig: 2345 10 90
# description: Start and Stop redis
PATH=/usr/local/bin:/sbin:/usr/bin:/bin
REDISPORT=6379
EXEC=/usr/local/redis/bin/redis-server
REDIS_CLI=/usr/local/redis/bin/redis-cli
PIDFILE=/var/run/redis.pid
CONF="/usr/local/redis/bin/redis.conf"
AUTH="1234"
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
设置开机启动
# 设置redis 权限
chmod 755 /etc/init.d/redis
# 启动redis
/etc/init.d/redis start
# 设置开机启动
cd /etc/init.d/
chkconfig redis on
注意:
如果无法通过http协议访问虚拟,需要关闭防火墙,防火墙相关命令
service iptables stop 暂停
chkconfig iptables off 永久关闭
service iptables status 检查状态
1.3、将redis-cli加入环境变量
# 编辑profile文件
vim /etc/profile
# 在最后一排加入
export PATH=$PATH:/usr/local/redis/bin(自己redis的路径)
# 重新加载文件
source /etc/profile
在家目录下试试能用不
2、redis.conf配置文件
2.1、配置文件修改
第一种:你可以直接在目录下找到redis.conf
# 如标题1安装redis,本文安装在/usr/local/redis/bin/下,所以在该目录能找到redis.conf
cd /usr/local/redis/bin/
ls
vi redis.conf
第二种:在./redis-cli下使用CONFIG修改配置
# 查看所有配置项
redis 127.0.0.1:6379> CONFIG GET *
# 查看loglevel
redis 127.0.0.1:6379> CONFIG GET loglevel
# 设置daemonize为yes
redis 127.0.0.1:6379>CONFIG SET daemonize “yes”
2.2、配置文件参数说明
参数 | 值 | 描述 |
---|---|---|
daemonize | no/yes | 是否后台运行 |
pidfile | 路径 | 记录pid的文件 |
port | 端口号 | 默认端口为 6379 |
bind | ip地址 | 绑定的主机地址,一般为127.0.0.1 |
timeout | 多少秒 | 当客户端闲置多长秒后关闭连接,为 0 表示关闭该功能 |
loglevel | debug/verbose/notice/warning | 日志记录级别,默认为notice |
logfile | stdout | 日志记录方式,stdout为标准输出,则日志将会发送给 /dev/null |
… |
更多内容参考:https://www.runoob.com/redis/redis-conf.html
3、五大类型 指令
1、redis客户端的指令不区分大小写
2、进入本地redis客户端 (如果没有配置路径,需要到对应目录下启动)
redis-cli
进入远程redis客户端
redis-cli -h host -p port -a password
3、redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
3.1、String
1、String 类型中一个k(键)对应一个v(值)
2、String类型的v(值)可以包含任何数据。如数字,字符串,jpg图片或者序列化的对象。(最大能存储 512MB)
String的指令:
指令 | |
---|---|
get(查) 、 set(增、改)、 del(删) 、 incr(值增操作)、 decr(值减操作)
127.0.0.1:6379> set a 10 # 增
OK
127.0.0.1:6379> get a # 查
"10"
127.0.0.1:6379> incr a # 将a的值增加1
(integer) 11
127.0.0.1:6379> get a
"11"
127.0.0.1:6379> decr a # 将a的值减1
(integer) 10
127.0.0.1:6379> del a # 删,返回的是删掉几条数据
(integer) 1
3.2、List
1、List (列表)其实就是一个k(键)有多个按顺序排列的v(值)
2、一个列表最多可以包含 2的32次方 - 1 个元素 (42亿多个元素)。
List的指令:
指令 | 功能 |
---|---|
lpush | 左增 |
rpush | 右增 |
lset | 改,根据下标 |
lindex | 查,一个 |
lrange | 查,范围 |
llen | 查长度 |
ltrim | 删,范围 |
lpop | 移除并返回列表的第一个元素。 |
rpop | 移除并返回列表的最后一个元素。 |
blpop | 移除并返回列表的第一个元素。如果没有元素,他将等待元素出来为止 |
brpop | 移除并返回列表的最后一个元素。如果没有元素,他将等待元素出来为止 |
linsert k before v1 v2 | 在v1前插入v2 |
LREM k count v | 去除重复 |
其他指令参考:https://www.runoob.com/redis/redis-lists.html
127.0.0.1:6379> lpush aa 100
127.0.0.1:6379> rpush aa 300
127.0.0.1:6379> lrange aa 0 10 # 查aa中下标为0-10的数据
127.0.0.1:6379> lrange aa 0 -1 # 查所有
127.0.0.1:6379> lset aa 2 500 # 更改aa中下标为2的值,改为500
127.0.0.1:6379> ltrim aa 0 1 # 删除下标为0-1中的元素
127.0.0.1:6379> ltrim aa 1 0 # 清空aa中所有内容,start要比end大,且都为正数,就是删所有
127.0.0.1:6379> ltrim aa 1 -1 # 只删除第0个元素
127.0.0.1:6379> linsert aa before "10" "100" # 在10前插入100
3.3、Set
1、Set 是 String 类型的无序集合、但不能出现重复值。
set指令:
指令 | 功能 |
---|---|
sadd | 增 ,一个或多个 |
srem | 删,一个或多个,不存在的值就忽略, |
spop | 移除并返回集合中的一个随机元素 |
sunion | 查,可以查多个set的并集 |
scard | 查集合里有多少个元素 |
sdiff | 查第一个集合与其他集合之间的差异 |
更多set指令参考:https://www.runoob.com/redis/redis-sets.html
127.0.0.1:6379> SADD aaa vv1
127.0.0.1:6379> sadd aaa vv1 vv2
127.0.0.1:6379> srem aaa vv1
127.0.0.1:6379> sunion aaa bbb
127.0.0.1:6379> sdiff aaa bbb
3.4、哈希
1、hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
2、每个 hash 可以存储 232 - 1 键值对(40多亿)。
3、hash里面存的是一张表,包含了多个k
hash指令:
指令 | 功能 |
---|---|
hset | 增 |
hdel | 删除字段,一个或多个 |
hget | 获取指定k的v |
hmget | 获取指定k的v,可以多个 |
hkeys | 获取所有k |
hgetall | 获取某个表的所有值(有k、v) |
hvals | 获取某个表的所有值(只返回v) |
hexists | 查看某个k是否存在,返回1存在,0不存在 |
hincrby | 为某个值指定增量(整数) |
hincrbyfloat | 为某个值指定增量(浮点) |
更多hash指令查看:https://www.runoob.com/redis/redis-hashes.html
127.0.0.1:6379> HSET myhash field1 "foo"
127.0.0.1:6379> HDEL myhash field1
127.0.0.1:6379> HGETALL myhash
127.0.0.1:6379> HEXISTS myhash field1
3.5、有序集合
1、有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。
2、有序集合里每个V都有一个 double 类型的分数(类似索引,但分数可以重复),V利用分数进行从小到大排列。
3、集合中最大的成员数为 2的23次方- 1(40多亿)。
sorted set指令:
指令 | 功能 |
---|---|
zadd | 增 |
zrem | 删,可以多个 |
Zremrangebyscore | 移除有序集中,指定分数区间内的所有成员。 |
zrange | 查,范围 |
zcard | 查分数 |
Zcount | 查分数范围内的V |
Zrank | 查索引 |
更多有序集合指令参考:https://www.runoob.com/redis/redis-sorted-sets.html
127.0.0.1:6379> ZADD bb 1 vv1
127.0.0.1:6379> ZREM bb vv1
127.0.0.1:6379> ZRANGE bb 0 -1 WITHSCORES # 显示整个有序集成员
127.0.0.1:6379> ZRANGE bb 1 2 WITHSCORES # 显示有序集下标区间 1 至 2 的成员
127.0.0.1:6379> ZRANK bb vv1
127.0.0.1:6379> ZREMRANGEBYSCORE bb 1500 3500
4、统计、事务、消息队列
4.1、HyperLogLog
1、用于统计基数(不存储元素,只存储数量)。
2、优点是运算“快”、占内存“小”(一个键占12KB,可计算近 2^64 个不同元素的基数)。
3、HyperLogLog是一种算法,并非redis独有。
4、一般少量数据统计不会使用它,大量数据使用才能体现它的优越
例:
# 添加统计
127.0.0.1:6379> pfadd m1 1 2 3 4 1 2 3 2 2 2 2
# 获取基数值
127.0.0.1:6379> pfcount m1
# 合并多个k
127.0.0.1:6379> pfmerge ms m1 m2
# 获取合并后的基数
127.0.0.1:6379> pfcount ms
4.2、消息通信
就是一边发数据另一边收数据
指令 | 功能 |
---|---|
subscribe | 订阅,可以订阅多个 |
psubscribe | 订阅,可以模糊、多匹配订阅 |
publish | 发送 |
pubsub channels | 查看正在被订阅的k |
PUNSUBSCRIBE | 退订所有 |
UNSUBSCRIBE | 退订 |
127.0.0.1:6379> PSUBSCRIBE a* # 订阅所有以a开头的频道,支持其他符号:?、[]
4.3、事务
事务用来一次执行多个命令, 并且带有以下三个重要的保证:
- 批量操作在发送 EXEC 命令前被放入队列缓存。
- 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
- 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
例:
# 开始输入事务中的指令
redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUED
redis 127.0.0.1:6379> GET book-name
QUEUED
redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUED
redis 127.0.0.1:6379> SMEMBERS tag
QUEUED
# 指令输入完成,开始执行事务
redis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"
2) "C++"
3) "Programming"
指令 | 功能 |
---|---|
MULTI | 开始输入事务 |
EXEC | 执行事务 |
DISCARD | 放弃事务 |
Watch | 监视,如果被监视的k被其他命令动用,这个事务被打断 |
UNWATCH | 取消监视 |
4.4、脚本
在redis指令内部实现逻辑。
1、脚本采用的语言:Lua,redis客户端自带其编译器
Lua教程:https://www.runoob.com/lua/lua-basic-syntax.html
2、redis使用Eval指令接Lua脚本
具体使用方法参考:https://www.runoob.com/redis/scripting-eval.html
4.5、其他指令
指令 | 功能 |
---|---|
AUTH password | 验证密码是否正确 |
ECHO message | 打印字符串 |
PING | 测服务端客户端连接是否正常 |
SELECT index | 切换到指定库 |
INFO | 服务器命令,更多请参考:https://www.runoob.com/redis/redis-server.html |
geoadd | 添加地理信息,更多请参考:https://www.runoob.com/redis/redis-geo.html |
XADD | 添加到消息队列,Redis 5.0 版本新增加的数据结构。 |
XDEL | 删除消息队列中的消息 |
XRANGE | 获取消息队列,范围 |
关于消息队列:
1、Redis Stream 主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。
2、更多关于消息队列参考:https://www.runoob.com/redis/redis-stream.html
还没有评论,来说两句吧...