一、简介
1.安装
Redis官网地址
Redis中文官网地址
Redis的版本号第二位为奇数,表示非稳定版本。偶数为稳定版本。
安装步骤特别简单,只需要下载压缩包(可以直接在官网下载或者通过wget下载)
依次执行下面命令即可
$ wget https://download.redis.io/releases/redis-6.2.6.tar.gz
$ tar xzf redis-6.2.6.tar.gz
$ cd redis-6.2.6
$ make
$ make install
redis默认安装路径 use/local/bin,主要有以下几个可执行文件。
redis-server
Redis服务器启动命令redis-cli
客户端,操作入口
2.安装包方式
去redis官网下载redis安装包:https://redis.io/
redis大多数情况下是在linux系统上使用,下载的压缩包也是linux系统的压缩包。我们可以使用WinSCP工具将下载的压缩包放到服务器或者虚拟机上。
安装gcc。centos的系统使用yum install gcc,安装过程中有提示就全选y。安装完成后,输入gcc --version,显示以下内容即安装完成。
解压redis压缩包,tar -zxvf xxxx.tar.gz。解压完成后,会在当前目录中生成一个redis目录,进入该目录,输入make,没有报错即编译完成。
在当前目录输入make install进行安装
安装完成后,会自动在/usr/local/bin目录下生成6个文件
- redis-benchmark:性能测试工具
- redis-check-aof:修复有问题的aof文件
- redis-check-dump:修复有问题的dump.rdb文件
- redis-sentinel:redis集群使用
- redis-server:redis服务器启动命令
- redis-cli:客户端,操作入口
以上便完成了redis的安装,启动redis有两种方式:
1、前台启动,
在命令行输入redis-server即可启动,关闭时输入exit或者ctrl + c。这种启动方式的缺点是当你终端关闭时,redis也会关闭。
2、后台启动。
(1)首先进入刚开始解压缩生成的redis-xxx目录中,在该目录中有一个redis.conf文件。
(2)输入cp redis.conf /etc/redis.conf,将文件复制到etc目录下。
(3)使用vim修改etc下的redis.conf文件,找到daemonize修改其为yes,然后保存退出。
(4)最后进入/usr/local/bin目录,输入redis-server /etc/redis.conf,后台启动完成。
3、输入redis-cli命令即可连接redis服务,要想关闭redis后台服务,可以在redis-cli中输入shutdown关闭后台服务,想退出redis-cli,可以使用exit退出。
3.Redis服务启动关闭
前台启动
直接在相应目录下执行redis-serve
命令
后台启动
① 拷贝一份redis.conf到其他目录
② 修改redis.conf中的daemonize no(128行)改为yes
③ redis-server /路径/redis.conf
服务关闭
① redis-cli -p 端口号 shutdown
② ps -ef | grep redis
kill -9 进程号
3.基础介绍
① redis的默认端口号是6379。
② redis默认有16个数据库,从0-15。
③ redis采用单线程+多路IO复用
二、redis的全局命令
1.基本使用命令
select 2
切换数据库flushdb
清空当前库flushall
清空全部库
2.key全局命令
dbsize
查看当前库有多少keykeys *
查看当前库所有key,支持模糊查询,例如key *ool,可以查到所有ool结尾的keytype key1
查看key1的数据类型exists key1
判断key1是否存在expire key1 10
为key1设置10s过期时间ttl key1
查看key1还有多少秒过期,-1表示永不过期,-2表示已过期del key
删除指定keyunlink key
非阻塞删除key
3.配置相关命令
info clients
查看redis当前连接数config get maxclients
查看redis最大连接数
三、redis的基本数据类型
1.String类型
String类型是二进制安全的,意味着Redis的string可以包含任何数据,比如图片等。一个Redis中字符串value最多可以是512M。
set <key> <value>
添加键值对get <key>
通过key获取valueappend <key> <value>
将给定的value追加到原值的末尾,如果没有就新建strlen <key>
获取对应value的长度setnx <key> <value>
当key不存在时,添加键值对incr <key>
将key中存储的数值加1.如果为空,则新增值为1decr <key>
减一,如果为空,则新增值为-1incrby/decrby <key> <步长>
将key中的数字值增减步长mset/msetnx <key> <value> <key> <value>
同时多个key,value。mset任意一个存在则失败。setex <key> <过期时间> <value>
set的同时设置过期时间getset <key> <value>
获取旧值,同时用新值覆盖
String字符串小于1M时,扩容都是加倍现有空间。如果超过1M,扩容时一次只会多扩1M空间。字符串最大长度为512M
2.List类型
redis的列表是简单的字符串列表,可以添加一个元素到头部或尾部。底层是双向链表,对两端的操作性很高,通过索引下标操作中间节点性能较差。
① lpush/rpush <key> <value1> <value2> <value3>
从左边/右边插入一个或多个值。例如从左边放入v1,v2,v3。存放的顺序是v3,v2,v1
② lpop/rpop <key>
从左边/右边吐出一个值
③ rpoplpush <key1> <key2>
从key1列表右边吐出一个值,插到key2列表左边。
④ lrange <key> <start> <stop>
按照索引下标获得元素(从左往右)
⑤ lindex <key> <index>
按照索引下标获得元素(从左往右)
⑥ llen <key>
获取列表长度
⑦ linsert <key> before/after <value> <newvalue>
在value的后面插入newvalue
⑧ lrem <key> <n> <value>
从左边删除n个value(从左往右)
⑨ lset <key> <index> <value>
将列表key下标为index的值替换成value
list的数据结构为快速链表quickList。
在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也就是压缩列表。
当数据量较多时会将多个ziplist改成quicklist。
因为普通链表需要附加的指针空间太大,redis将链表和ziplist结合起来组成quicklist。这样既满足了快速插入删除,又不会出现太大的空间冗余。
3.Set类型
Redis的Set是string类型的无序不重复集合,底层是一个value为null的hash表。
常用
① sadd <key> <value1> <value2> <value3>
将一个或多个member元素加入到结合key中,已经存在的元素被忽略。
② smembers <key>
取出该集合所有值
③ sismember <key> <value>
判断集合key种是否含有该value值,有为1没有为0
④ scard <key>
返回该集合中元素的个数
⑤ srem <key> <value1> <value2>
删除集合中某几个元素
不常用
⑥ spop <key>
随机从该集合中吐出一个值,集合中删除该元素。
⑦ srandmember <key> <n>
随机从该集合中取出n个值,不会从集合中删除
⑧ smove <source> <destination> value
把集合中一个值从一个集合source移动到另一个集合destination。
⑨ sinter <key1> <key2>
返回两个集合的交集元素
sunion <key1> <key2>
返回两个集合的并集元素
sdiff <key1> <key2>
返回两个集合中的差集元素,key1中有的但是key2中没有的。
Set底层是通过HashMap实现的。HashMap的key是非重复而且随机的。将HashMap所有的value都指向同一对象。他的添加删除查找复杂度都是o(1),也就是说对着数据的增加,查找数据的时间不变。
4.hash类型
相当于一个key,可以存一个hashmap<field,value>。
hset <key> <field> <value>
给key中的field键赋值valuehmset <key1> <field1> <value1> <field2> <value2> ....
批量设置hash的值,4.0后hset也能实现此功能hget <key1> <field>
从key1中取出field的valuehgetall <key1> <field>
获取该key下所有的键值hexists <key1> <field>
查看哈希表key中,给定阈field是否存在。hkeys <key>
列出该hash集合所有的fieldhvals <key>
列出该hash集合所有的valuehincrby <key> <field> <increment>
为哈希表key中所有的field的值增减incrementhsetnx <key> <field> <value>
将哈希表key中field键值设为value,仅仅当field不存在时成功
当field-value长度较短且个数较少时,使用压缩列表,否则使用hashtable。
5.有序集合Zset
Redis有序集合zset是一个没有重复元素的字符串集合。它的每个成员关联了一个评分(score),这个评分被用来按照从最低分到最高分排列集合中的成功。评分可以重复。
zadd <key> <score1> <value1> <score2> <value2>
将一个或多个元素和评分加入到集合中zrange <key> <start> <stop> [WITHSCORES]
返回有序集合中,下标(按照分数从小到大排序,第一个元素为0,第二个元素为1…)在start-stop之间的元素。带WITHSCORES可以让分数和值一起返回zrangebyscore <key> <min> <max> [WITHSCORES] [limit offset count]
返回有序集合key中,所有score值介于min和max之间(包括等于)的成员,成员按score值从小到大次序排列zrevrangebyscore key <max> <min> [WITHSCORES] [limit offset count]
从大到小排列zincrby <key> <increment> <value>
为元素的score加上增量zrem <key> <value>
删除该集合下,指定值的元素zcount <key> <min> <max>
统计该分数区间内的元素个数zrank <key> <value>
返回该值在集合中的排名,从0开始
SortedSet(zset)是redis提供的一个特别的数据结构,一方面等价于java的数据结构Map<String,Double>,可以给每一个value赋予一个权重score,另一方面又类似于TreeSet,内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过score的范围来获取元素的列表。
zset底层使用两个数据结构:
-
hash,hash的作用就是关联value和权重score,保障value的唯一性。可以通过元素value 找到对应的score值。
-
跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。