Redis概述
Redis是什么
- Redis(Remote Dictionary Server 远程字段服务)是一个开源的使用ANSI C语言编写、支持网
络、内存亦可持久化的key-value数据库,并提供多种语言的API。 - Redis是一个key-value存储系统,它支持存储的value类型相对更多,包括string、list、set、
zset(sorted set --有序集合)和hash。这些数据结构都支持push/pop、add/remove及取交集并
集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的
排序。为了保证效率,数据都是缓存在内存中,Redis会周期性的把更新的数据写入磁盘或者把修
改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。 - Redis提供了java、C/C++、PHP、JavaScript、Perl、Object-C、Python、Ruby、Erlang等客户
端,使用很方便。
Redis能干嘛
- 读写效率高,用于高速缓存
- 发布,订阅消息(消息通知)
- 地图信息分析
- 活动排行榜或计数
- …………
Redis特点
- 多样的数据类型:Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,
hash等数据结构的存储。 - Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使
用。 - Redis的所有操作都是原子性的。
- 支持主从复制及集群。
Redis安装
下载地址
Redis官方网址:Downloads - Redis
没注册要先注册,不懂就搜。
下载Redis
- 下滑找到Install Redis from source
-
下载到/opt目录下
cd /opt wget https://download.redis.io/releases/redis-7.0.15.tar.gz
-
解压,解压后得到redis-stack-server-7.2.0-v10目录
解压命令:
tar -zxvf redis-7.0.15.tar.gz
安装GCC
安装C语言编译环境
yum group install "Development Tools" -y
通过使用 gcc --version 命令打印 GCC 版本,来验证 GCC 编译器是否被成功安装:
gcc --version
安装Redis
- 编译Redis
在redis-7.0.15目录下执行:
cd redis-stack-server-7.2.0-v10/
make
出现下图代表编译成功
-
安装Redis
在redis-7.0.15下执行:
make install
出现下图代表安装成功
-
安装目录: /usr/local/bin
redis-benchmark:Redis自带的基准性能测试工具
redis-check-aof:对有问题的 AOF 文件进行修复,AOF和RDB文件后面会说明
redis-check-rdb:对有问题的 RDB文件进行修复
redis-sentinel:Redis集群使用
redis-cli:客户端
redis-server:服务器启动 -
服务启动
前台启动:/usr/local/bin下执行
后台启动:
拷贝redis-6.2.4目录中的redis.conf文件到其他目录
mkdir /usr/local/myredis cd /opt/redis-7.0.15/ cp redis.conf /usr/local/myredis/redis.conf
设置/usr/local/myredis/redis.conf文件中的daemonize属性,由no改为yes
cd /usr/local/myredis/ vim redis.conf
在/usr/local/bin下执行
cd /usr/local/bin/ ./redis-server /usr/local/myredis/redis.conf
通过ps aux | grep redis-server查看服务是否启动
ps aux | grep redis-server
-
客户端启动
/usr/local/myredis/下执行
cd /usr/local/myredis/ redis-cli
ping命令可以检测服务器是否正常(服务器返回PONG)
ping
Redis基本知识
-
端口6379的由来
6379 = Merz
Merz全名Alessia Merz,是意大利的一位广告女郎。
-
默认有16个数据库,且初始状态默认选择0号数据库(即第一个数据库)。
-
可以使用select 进行数据库切换。
select 8 切换到8号数据库
-
统一密码管理,所有库密码都一致。
-
dbsize-查看当前数据库的key数量。
-
flushdb-清空当前库。
-
flushall-清空所有库。
-
为什么Redis是单线程且效率极高:
- 绝大部分请求是纯粹的内存操作。
- 避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,
- 不用去考虑。各种锁的问题,不存在加锁释放锁操作。
- 使用IO多路复用技术,可以处理并发的连接。
Redis数据类型
key键
- keys * 查看当前库中所有的key 。
-
exists key 判断某个key是否存在。
可以设置多个key,只返回存在的个数,但不返回哪一个存在/不存在。
exists k1 查看k1是否存在,如果存在返回1 exists k1 k2 k3 查看k1 k2 k3是否存在,如果k1 k2存在,k3不存在,则返回2
-
move key db 将当前数据库的 key 移动到给定的数据库 db 当中。
move k1 8 将k1从当前数据库移动到8号库
-
type key 查看当前key 所储存的值的类型。
返回当前key所储存的值的类型,如string 、list等。
-
del key 删除已存在的key,不存在的 key 会被忽略。
可以设置多个key,返回删除成功的个数。
del k1 删除k1,如果成功返回1,失败返回0 del k1 k2 k3 删除k1 k2 k3,如果k1 k2存在,k3不存在,则返回2
-
expire key time 给key设置time秒的过期时间。
设置成功返回 1 。 当 key 不存在返回 0。
expire k1 10 给k1设置10秒后过期
-
ttl key 以秒为单位返回 key 的剩余过期时间。
当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单位,返回 key 的剩余生存时间。
-
persist key 移除给定 key 的过期时间,使得 key 永不过期。
当过期时间移除成功时,返回 1 。 如果 key 不存在或 key 没有设置过期时间,返回 0 。
五大数据类型-String(字符串)
简介
- String是Redis最基本的类型,一个key对应一个value。
- String是二进制安全的,意味着String可以包含任何数据,比如序列化对象或者一张图片。
- String最多可以放512M的数据。
String底层数据结构
- String底层数据结构是简单动态字符串(simple dynamic string,SDS)。
- 类似于 Python 中的 List ,采用预分配方式来减少内存的频繁分配。
如图,内存实际大小一般都要高于字符串实际大小。当字符串长度小于1M时,扩容都是加倍现有的空
间,如果超过1M,扩容时每次只会多扩1M的空间。字符串最大长度为512M。
常用命令
-
set key value 用于设置给定 key 的值。如果 key 已经存储其他值, set 就重写旧值,且无视类型。
set k1 v1 向Redis中设置一个k1的键值对 set k1 100 将k1的值由v1重置为100
-
get key 用于获取指定 key 的值。如果 key 不存在,返回 nil 。
-
append key value 将给定的value追加到key原值末尾。
如果 key 已经存在并且是一个字符串, append 命令将 value 追加到 key 原来的值的末尾。
如果 key 不存在, append 就简单地将给定 key 设为 value ,就像执行 set key value 一样。append k2 v2 在Redis中不存在k1,所以直接设置k1的值为v2 append k1 v2 向k1的值末尾添加一个v2,最终结果为100v2
-
strlen key 获取指定 key 所储存的字符串值的长度。当 key 储存的不是字符串值时,返回一个错误。
-
setex key time value 给指定的 key 设置值及time 秒的过期时间。如果 key 已经存在, setex命令将会替换旧的值,并设置过期时间。
setex k1 10 v1 向Redis中设置一个k1的键值对并且10秒后过期
-
setnx key value当key不存在时,设置给定 key 的值。如果key存在,则没有任何影响。
setnx k1 v1 向Redis中设置一个k1的键值对 setnx k1 v2 Redis中存在k1,则没有影响,k1的值仍然为v1
-
incr key 将 key 中储存的数字值增一。
如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 incr 操作。
如字符串类型的值不能表示为数字、或者是其他类型,那么返回一个错误。incr k3 因为Redis中不存在k3,所以先初始化为0,再递增,值为1 incr k3 存在k3,递增后k3的值为2 incr k1 incr k2 因为k1,k2不为数值,Redis返回一个错误
-
decr key将 key 中储存的数字值减一。
如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 decr 操作。
如字符串类型的值不能表示为数字、或者是其他类型,那么返回一个错误。decr k4 因为Redis中不存在k4,所以先初始化为0,再递增,值为-1 decr k4 存在k4,递增后k1的值为-2 decr k2 因为k2不为数值,Redis返回一个错误
-
incrby/decrby key step 将key存储的数字值按照step进行增减。
如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 incrby/decrby 命令。
如字符串类型的值不能表示为数字、或者是其他类型,那么返回一个错误。 -
mset key1 value1 key2 value2 ……同时设置一个或多个 key-value 。
mset k1 v1 k2 v2 k3 v3 同时向Redis中设置了k1 k2 k3
-
mget key1 key2 ……返回所有(一个或多个)给定 key 的值。
如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。
mget k1 k2 k3 k4 k5 k6 同时获取k1 k2 k3 k4 k5 k6
-
msetnx key1 value1 key2 value2 ……用于所有给定 key 都不存在时,同时设置一个或多个key-value 。
msetnx具有原子性特性,有一个失败,则都失败。
msetnx k6 v6 k7 v7 向Redis中设置k6 k7两个键值对 msetnx k1 v6 k8 v8 Redis中存在k1,k1设置失败,由于原子性特性,k8也设置失败
-
getrange key start end用于获取存储在指定 key 中字符串的子字符串。字符串的截取范围由start 和 end 两个偏移量决定(包括 start 和 end 在内)。
set java helloworld 设置一个key为java,value为helloworld的值 getrange java 0 3 获取索引0-3的值,结果为hell
-
setrange key offset value用指定的字符串重写给定 key 所储存的字符串值,重写的位置从偏移量 offset 开始。
set java helloworld 设置一个key为java,value为helloworld的值 setrange java 5 baizhan 从偏移位置5(w)开始,用baizhan重写key
五大数据类型-List(列表)
简介
List是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
底层是一个双向链表,对两段操作性能极高,通过索引操作中间的节点性能较差。
一个List最多可以包含 2 32 − 1 2^{32}-1 232−1个元素 ( 每个列表超过40亿个元素)。
常用命令
敲命令前先清除所有key和values
FLUSHALL
- lpush/ rpush key1 value1 value2 value3……从左边(头部)/右边(尾部)插入一个或多个值。
lpush k1 v1 v2 v3 从左边放入v1 v2 v3
rpush k1 v4 v5 v6 从右边放入v4 v5 v6
-
lrange key start end返回key列表中的start和end之间的元素(包含start和end)。 其中 0 表示列表的第一个元素,-1表示最后一个元素。
lrange k1 0 2 取出列表里前3个值,结果为v3 v2 v1 lrange k1 0 -1 取出列表里全部值,结果为v3 v2 v1 v4 v5 v6
-
lpop/rpop key移除并返回第一个值/最后一个值。值在键在,值光键亡。
lpop k1 从列表中删除v3,并返回,当前列表全部值v2 v1 v4 v5 v6 rpop k1 从列表中删除v6,并返回,当前列表全部值v2 v1 v4 v5
-
lindex key index 获取列表index位置的值(从左开始)。
lindex k1 3
-
llen key获取列表长度。
llen k1
-
lrem key count value从左边开始删除与value相同的count个元素。
lrem k1 2 v1 从左边开始删除k1列表中2个v1元素
-
linsert key before/after value newvalue 在列表中value值的前边/后边插入一个newvalue值(从左开始)。
linsert k1 before v2 v5 在v2前面插入一个v5
-
lset key index value将索引为index的值设置为value
lset k1 1 v1
五大数据类型-Set(集合)
简介
与List类似是一个列表功能,但Set是自动排重的,当需要存储一个列表数据,又不希望出现重复数据时,Set是一个很好的选择。
Set是String类型的无序集合,它底层其实是一个value为null的hash表,所以添加、删除、查找的时间复杂度都是O(1)。
一般来说,一个算法如果是O(1),随着数据增加,查找数据的时间不变。
集合中最大的成员数为 2 32 − 1 2^{32}-1 2