Redis是一个开源的key-value存储系统
和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步
Redis是单线程+多路IO复用技术
多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态,比如调用select和poll函数,传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则阻塞直到超时。得到就绪状态后进行真正的操作可以在同一个线程里执行,也可以启动线程执行(比如使用线程池)
1 ) 配合关系型数据库做高速缓存
2 ) 由于其拥有持久化能力,利用其多样的数据结构存储特定的数据
1 ) 需要事务支持
2 ) 基于sql的结构化查询存储,处理复杂的关系,需要即席查询(用户自定义查询条件的查询)
方式1:官网下载安装包
redis官网地址:
https://redis.io/
中文网站
http://www.redis.cn/
方式2:直接通过wget下载(redis版本自行修改)
wget http://download.redis.io/releases/redis-3.2.8.tar.gz
tar -zxf redis-3.2.8.tar.gz -C /opt/modules
cd /opt/modules
mv redis-3.2.8 redis
redis是由c语言开发的,所以需要安装c语言环境
sudo yum -y install gcc-c++
sudo yum -y install tcl
cd /opt/modules/redis/
确保在redis根目录下执行以下编译命令:
sudo make && make install PREFIX=/opt/modules/redis
只要编译完成之后像上图一样,没有error,就表示编译成功!
先在redis根目录下创建两个文件夹,logs用来存储log日志,redisdata用来存储redis数据持久化的数据
mkdir -p /opt/modules/redis/logs
mkdir -p /opt/modules/redis/redisdata
vim /opt/modules/redis/redis.conf
1)61行左右 修改绑定的主机为本机主机名(表示能访问redis的主机名,可以添加多个IP,中间用空格间隔)
2)128行左右 修改 no 为 yes,表示redis作为守护线程在后台运行
3)150行左右,因为在第二步将redis作为守护线程后台运行了,所以该线程的pid保存在pidfile
中,可自行修改或者默认,当然如果你没有将redis放置后台,pidfile
文件就不会创建
4)163行左右,redis日志存放的文件,我放在我之前创建的logs目录下,取名 redis.log
5)247行左右,设置redis内存数据持久化的目录,我放在我之前创建的redisdata目录下
1)启动redis-server
cd /opt/modules/redis/src
./redis-server ../redis.conf
查看是否启动成功
ps -ef | grep redis
./redis-cli -h 主机名
看下图表示连接成功
方式1:shutdown save|nosave && exit
方式2: ./redis-cli -h 主机名 shutdown
Redis-benchmark
:性能测试工具
Redis-check-aof
:修复有问题的AOF文件
Redis-check-dump
:修复有问题的dump.rdb文件
Redis-sentinel
:Redis集群使用
redis-server
:Redis服务器启动命令
redis-cli
:客户端,操作入口
string
、list
、set
、hash
、zset
①.String是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value
②.String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象
③.String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M
①.单键多值
②.Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
③.它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差
①.Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的
②.Redis的Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)
①.Redis hash 是一个键值对集合
②.Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象
③.类似Java里面的Map
①.Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的没有成员都关联了一个评分(score) ,这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 。
②.因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表
1.设置KV
方式1:如果k不存在,设置v,如果k存在,则覆盖原始v
set k v [EX time] [PX time]
EX:秒
PX:毫秒
方式2:设置多个kv,如果k不存在,设置v,如果k存在,则覆盖原始v
mset k1 v1 k2 v2 k3 v3 ...
方式3:如果k不存在,设置v,如果k存在,不做任何操作
setnx k v
方式4:设置多个kv,只有所有k都不存在,才会设置v,否则,不做任何操作(因为Redis具有原子性,是单线程的,要么全部成功,要么全部失败)
msetnx k v k2 v2 k3 v3 ...
2.获取V
方式1:根据k获取v,如果没有k,则返回 nil
get k
方式2:根据多个k获取多个v,如果没有k,则返回 nil
mget k1 k2 k3 k4 ..
3.显示数据库中的K
方式1:
keys *
keys ?
* 表示任意key
? 表示匹配key为1个字母的,同理:?? 表示匹配key为2个字母
在数据库中随机回返一个key
randomkey
4.判断是否存在K
exists k
如果存在返回 (integer) 1
如果不存在返回 (integer) 0
5.删除K
del k1 k2 ...
6.获取V长度
strlen k
7.向V中追加字符串
append k v
8.查看K过期时间
ttl k
-1表示永不过期,-2表示已经过期,其他数字表示剩余过期时间(s)
pttl k
-1表示永不过期,-2表示已经过期,其他数字表示剩余过期时间(ms)
9.设置key过期时间
expire k seconds(s)
10.查看当前数据库的K数量
dbsize
11.使V自增/自减(只能对v为数字进行操作)
incr k v自增
decr k v自减
incrby k step v自增指定步长(整数)
decrby k step v自减指定步长(整数)
incrbyfloat k step v自增指定步长(小数)
12.设置KV的同时设置过期时间
setex k 过期时间 v
13.设置新值的同时获取旧值
getset k v
14.用v覆盖从start开始的值
setrange k start v
15.获取指定k的v值范围,只不过左闭右闭
getrange k start end
16.选择其他数据库
select index
17.清空数据库
flushdb 清空当前数据库
flushall 清空所有数据库
18.查询key对应数据的类型
type k
19.对key进行重命名
Rename oldk newK
20.移除key的过期时间
persist k
1.向列表左/右边插入一个或多个值
lpush k v1 v2 v3 v4 ...
rpush k v1 v2 v3 v4 ...
将一个值插入到已存在的列表头部
lpushx k v
将一个值插入到已存在的列表尾部
rpushx k v
2.从左边/右边取出一个值(如果把所有值取出,则该K也会删除)
lpop k //从左边
rpop k //从右边
3.从K1列表右边取出一个值,插入到K2列表左边
rpoplpush k1 k2
4.按照start和stop获取列表指定范围的值(从左到右)
lrange k start stop
start 和 stop 偏移量都是基于0的下标,即list的第一个元素下标是0(list的表头)
第二个元素下标是1,以此类推
偏移量也可以是负数,表示偏移量是从list尾部开始计数。
例如, -1 表示列表的最后一个元素,-2 是倒数第二个,以此类推
5.按照索引下标获取某个元素(从左到右)
lindex k index
6.根据索引修改值
lset k index v
7.获取列表长度
llen k
8.截取指定长度值
ltrim k start stop
9.在V的后面插入新的值
linsert k before(左)/after(右) v newv
10.删除值
lrem k n v
n 为正数,从左边删除n个v值
n 为负数,从右边删除n个v值
n 为0,删除列表所有v值
1.将一个或多个member元素加入到集合key中,已经存在于集合的member元素将会被忽略
sadd k v1 v2 v3 ...
2.显示该集合的所有值
smembers k
3.判断集合中的K是否含有V值,有返回1,没有返回0
sismember k v
4.返回该集合的元素个数
scard k
5.删除集合中的某个元素
srem k v1 v2 v3 ...
6.随机从该集合中取出n个值,取出的元素将会从集合中删除
spop k n
7.随机从该集合中取出n个值,取出的元素不会从集合中删除
srandmember k n
8.返回两个集合的交集元素
sinter k1 k2
sinterstore newK k1 k2
9.返回两个集合的并集元素
sunion k1 k2
sunionstore newK k1 k2
10.返回两个集合的差集元素
sdiff k1 k2
sdiffstore newK k1 k2
11.将数据从一个集合移动到另一个集合
smove k1 k2 v
sdiffstore newK k1 k2
1.设置hash值
方式1:给K集合中的 mapK设置值为 mapV
hset k mapK mapV
方式2:给K集合中的多个 mapK设置值为 mapV
hmset k mapK1 mapV1 mapK2 mapV2 ...
2.获取hash值
方式1:获取集合中mapK对应的mapV
hget k mapK
方式2:获取集合中多个mapK对应的mapV
hmget k mapK1 mapK2 mapK3 ...
3.查看指定hash集合K中,mapK是否存在
hexists k mapK
4.列出指定hash集合K的所有mapK
hkeys k
hgetall k
5.列出指定hash集合K的所有mapV
hvals k
6.将hash集合K中的mapK对应的mapV值增加num
hincrby k mapK num
hincrbyfloat k mapK num
7.设置hash值,在mapK不存在的情况下才会设置成功
hsetnx k mapK mapV
1.将一个或多个member元素及其score值加入到有序集K中
zadd k score1 v1 score2 v2 ...
2.返回有序集K中,下标在 start 和 stop 之间的元素(左闭右闭)
zrange k start stop [withscores]
3.返回有序集K中,分数在 min 和 max 之间的元素(左闭右闭)
zrangebyscore k min max [withscores]
4.返回有序集K中,分数在 max 和 min 之间的元素(左闭右闭)
zrevrangebyscire k max min [withscores]
5.为元素的score加上num值
zincrby k num v
6.删除该集合下指定值的元素
zrem k v
7.统计该集合指定分数区间内的元素个数
zcount k min max
8.返回该值在集合中的排名,从0开始
zrank k v