Redis基础介绍
- 随着互联网+大数据时代的来临,传统的关系型数据库已经不能满足中大型网站日益增长的访问量和数据量。这个时候就需要一种能够快速存取数据的组件来缓解数据库服务I/O的压力,来解决系统性能上的瓶颈。
数据库的发展历史
-
在互联网+大数据时代来临之前,企业的一些内部信息管理系统,一个单个数据库实例就能满足系统的需求
-
单数据库实例
-
随着系统访问用户的增多,数据量的增大,单个数据库实例已经满足不了系统的读取需求
-
缓存(memcache)+单数据库实例
-
缓存可以缓解系统的读取压力,但是数据量的写入压力持续增大,
- 缓存+主从数据库+读写分离
-
据量再次增大,读写分离以后,主数据库的写库压力出现瓶颈
- 缓存+主从数据库集群+读写分离+分库分表
-
互联网+大数据时代来临,关系型数据库不能很好的存取一些并发性高,实时性高的,并且数据格式不固定的数据。
- nosql+主从数据库集群+读写分离+分库分表
Redis为什么这么快
- Redis是纯内存操作,需要的时候需要我们手动持久化到硬盘中
- Redis是单线程,从而避开了多线程中上下文频繁切换的操作。
- Redis数据结构简单、对数据的操作也比较简单
- 使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求
- 使用多路I/O复用模型,非阻塞I/O
Redis地址
- 官网地址:https://redis.io/
- redis中文地址:https://redis.io/
- 命令地址:http://doc.redisfans.com/
Ubuntu安装Redis
- 下载压缩包
wget http://download.redis.io/releases/redis-5.0.9.tar.gz
- 解压
tar xzf redis-5.0.9.tar.gz
- 进入目录
cd redis-5.0.9/
- 安装make命令
sudo apt install make
sudo apt install make-guile
- 安装gcc redis 源码是C语言
sudo apt-get install gcc
- 源码编译
make
- 启动
src/redis-server redis.conf
Redis的配置文件
/etc/redis/redis.conf
当redis作为守护进程运行的时候,它会写一个 pid 到 /var/run/redis.pid 文件里面。
daemonize no
监听端口号,默认为 6379,如果你设为 0 ,redis 将不在 socket 上监听任何客户端连接。
port 6379
设置数据库的数目。
databases 16
根据给定的时间间隔和写入次数将数据保存到磁盘
下面的例子的意思是:
900 秒内如果至少有 1 个 key 的值变化,则保存
300 秒内如果至少有 10 个 key 的值变化,则保存
60 秒内如果至少有 10000 个 key 的值变化,则保存
save 900 1
save 300 10
save 60 10000
监听端口号,默认为 6379,如果你设为 0 ,redis 将不在 socket 上监听任何客户端连接。
port 6379
Redis默认只允许本地连接,不允许其他机器连接
bind 127.0.0.1
Redis数据库简单使用
dbsize 查看当前数据库的key数量
keys * 查看所有的key的内容
flushdb 清空当前数据库的key的数量
flushall 清空所有库的key
exists key 判断key是否存在
type key 查看数据的类型
setex key second value 设置key、value并创建出来
ttl key 查看多久后过期
expire key second 设置key过期时间
Redis五大数据类型
⚠️:Redis数据类型采用的是左右闭合的一种形式
- string是redis最基本的类型,一个key对应一个value
- string可以包含任何数据,最大不能超过512M
string
- 字符串(string)键是Redis最基本的键值对类型,这种类型的键值对会在数据库中把单独的一个键和单独的一个值关联起来,被关联的键和值既可以是普通的文字数据,也可以是图片、视频、音频、压缩文件等更为复杂的二进制数据。
set
- 设置值
set key value [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|KEEPTTL] [NX|XX] [GET]
set name small-j
out : ok
get
- 取值
get key
get name
out : small-j
mset
- 设置多个值
mset key value [key value ...]
mset name small-j age 18 gender nan class 1
out : ok
mget
- 取多个值
mget key [key ...]
mget name age gender class
out : small-j 18 nan 1
append
- 添加字段
append key value
append name demo
out : 11
del
- 删除,还可以删除多个key
del key [key ...]
del name
out : ok
strlen
- 返回字符串长度
strlen key
strlen name
out : 11
incr
- 依次增1
incr key
incr class
out : (integer) 2
decr
- 依次减1
decr key
decr class
out : (integer) 1
incrby
- 规定增加多少
incrby key increment
incrby class 2
out : (integer) 3
decrby
- 规定减少多少
decrby key incrment
decrby class 2
out : (integer) 1
getrange
- 获取制定区间范围内的值
- 并不会闭合
getrange key start end
getrange name 0 4
out : "small"
setrange
- 从第几位开始就开始替换,0 -1代表全部
setrange key offset value
setrange name 5 demo
out : (integer) 9
get name
out : "smalldemo"
list
lpush
- 从左获取长度
- 倒序排序
lpush key element [element ...]
lpush list01 1 2 3 4 5 6
out : (integer) 6
rpush
- 从右获取指定长度
- 正序排序
rpush key elemnet [element ...]
rpush list02 1 2 3 4 5 6
out : (integet) 6
lrange
- 获取对应的所有的值
lrange key start stop
lrange list01 0 -1
out : "6" "5" "4" "3" "2" "1"
lrange list02 0 -1
out : "1" "2" "3" "4" "5" "6"
lpop
- 移除
lrange
最前面的值(从最上面的值开始) lpop key [count]
lpop list02 2
out : "1" "2"
rpop
- 移除
lrange
最下面的值(从最下面的值开始) rpop key [count]
rpop list02 2
out : "6" "5"
lindex
- 根据索引来给出相对应的值
lindex key index
lindex list02 0
out : 3
llen
- 求列表的长度
llen key
llen list02
out : (integer) 2
lrem key
- 删N个value(如删除两个7)
lrem key count element
lpush list03 1 2 3 4 5 6 7 7 7 8 8 9 9 2
lrem list03 2 7
out : (integer) 2
ltrim key
- 开始index结束index,截取指定范围的值后在赋值给key
ltrim key start stop
ltrim list03 2 4
out : OK
rpoplpush
- 将list1中最后一个压入list2中第一位
rpoplpush source destination
lrange list01 0 -1
lrange list02 0 -1
rpoplpush list1 list2
lset
- 将list中的第几位换成几
lset key index element
lset list03 0 0
out : OK
linsert
- 在对应字段(之前之后)加数值
linsert key before|after pivot element
linsert list03 after 0 demo
out : (integer) 4
hash
- Redis的散列键会将一个键和一个散列在数据库里关联起来,用户可以在散列中为任意多个字段(field)设置值。与字符串键一样,散列的字段和值既可以是文本数据,也可以是二进制数据。
hset
-
给定字段并不存在于散列当中,那么这次设置就是一次创建操作,命令将在散列里面关联起给定的字段和值,然后返回1。
-
给定的字段原本已经存在于散列里面,那么这次设置就是一次更新操作,命令将使用用户给定的新值去覆盖字段原有的旧值,然后返回0。
-
hset key field value [field value ...]
当值不存在时
hset article title greet
out : (integer) 1
当值存在时
hset article title gre
out :(integer) 0
hsetnx
- HSETNX命令的作用和HSET命令的作用非常相似,它们之间的区别在于, HSETNX命令只会在指定字段不存在的情况下执行设置操作
- HSETNX命令在字段不存在并且成功为它设置值时返回1,在字段已经存在并导致设置操作未能成功执行时返回0
当值存在时
hsetnx article title demo
out : (integer) 0
当值不存在时
hsetnx article author small-j
out : (integer) 1
hget
- 取单个值
hget key field
hget article author
out : "Small-J"
hstrlen
- 获取长度
hstrlen key field
hstrlen article author
out : (integer) 7
hmset
- 可以一次设置多个值
hmset key field value [field value ...]
hmset article title "The use of the Redis" author "Small-J" gender 18 date "now-time"
out : ok
hmget
- 可以一次取多个值
hmget key field [field ....]
hmget article title author gender date
1) "The use of the Redis"
2) "Small-J"
3) "18"
4) "now-time"
hkeys
- 获取所有的键
hkeys key
hkeys article
1) "title"
2) "author"
3) "gender"
4) "date"
hvals
- 获取所有的值
hvals key
hvals article
1) "The use of the Redis"
2) "Small-J"
3) "18"
4) "now-time"
hgetall
- 获取所有的键值对
hgetall key
hgetall article
1) "title"
2) "The use of the Redis"
3) "author"
4) "Small-J"
5) "gender"
6) "18"
7) "date"
8) "now-time"
hdel
- 用于删除hash中的指定字段及其相关联的值
hdel key field [field ...]
hdel article author
out : (integer) 1
set
- Redis的集合(set)键允许用户将任意多个各不相同的元素存储到集合中,这些元素既可以是文本数据,也可以是二进制数据。虽然第4章中介绍的列表键也允许我们存储多个元素,但集合与列表有以下两个明显的区别:
- 列表可以存储重复元素,而集合只会存储非重复元素,尝试将一个已存在的元素添加到集合将被忽略。
- 列表以有序方式存储元素,而集合则以无序方式存储元素。
sadd
-
通过使用sadd命令,用户可以将一个或多个元素添加到集合中
-
sad key mmember [member ...]
sadd database redis mysql mongodb oralce
out : (integer) 4
当再次添加相同的集合
- 当添加相同的集合的时候将不会插入进去
sadd database redis
out : da(integer) 0
当添加部分相同的集合
- 当添加部分相同的集合的时候,只会插入不相同的
sadd database Neo4j redis mysql
out : (integer) 1
srem
- 通过使用SREM命令,用户可以从集合中移除一个或多个已存在的元素
srem key member [member ...]
srem database redis mysql
out : (interger) 2
smove
- 允许用户将指定的元素从源集合移动到目标集合
- ⚠️:当指定移动的集合不存在的时候不会报错,会创建出一个新的集合
smove source destination member
smove database nosql redis
out : (integer) 1
smembers
- 可以取得集合包含的所有元素
smembers key
smembers nosql
1) "redis"
2) "mongodb"
scard
- 获取给定集合的大小,即集合包括的元素数量
scard key
scard nosql
out : (interger) 2
sismember
- 检查给定元素是否存在于集合
sismember key member
sismember database mysql
out : (interger) 1
srandmember
- 可以从集合中随机地获取指定数量的元素
srandmember key [count]
srandmember database 2
1) "mysql"
2) "oralce"
spop
- 随机地从集合中移除指定数量的元素
spop key [count]
spop database 1
1) "mysql"
zset
- Redis的有序集合(sorted set)同时具有"有序"和"集合"两种性质,这种数据结构中的每个元素都由一个成员和一个与成员相关联的分值组成,其中成员以字符串方式存储,而分值则以64位双精度浮点数格式存储。
zadd
- 向有序集合添加一个或多个新成员
- 在给定XX选项的情况下, ZADD命令只会对给定成员当中已经存在于有序集合的成员进行更新,而那些不存在于有序集合的给定成员则会被忽略。换句话说,带有xx选项的ZADD命令只会对有序集合已有的成员进行更新,而不会向有序集合添加任何新成员。
- 在给定NX选项的情况下, ZADD命令只会把给定成员当中不存在于有序集合的成员添加到有序集合里面,而那些已经存在于有序集合中的给定成员则会被忽略。换句话说,带有NX选项的ZADD命令只会向有序集合添加新成员,而不会对已有的成员进行任何更新。
zadd key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]
指定XX
zadd salary xx 4500 "jack" 3800 "bob"
(integer) 0
指定NX
zadd salary nx 1800 jack 3800 bob
(integer) 2
zrem
- 可以从有序集合中移除指定的一个或多个成员
zrem key member [member]
zrem salary jack
(integer) 1
zscore
- 用户可以获取与给定成员相关联的分值
zscore key member
zscore salary bob
3800
zrange
- 按照分值大小实施升序排序的成员
zrange key min max [BYSCORE|BYLEX] [REV] [LIMIT offset count] [WITHSCORES]
zrange salary 0 -1
1) "jack"
2) "bob"
zrangebyscore
-
指定升序排序或降序排序的方式获得
-
zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
zrangebyscore salary 0 2000
1) "jack"
zcard
- 取得有序集合的基数,即有序集合包含的成员的数量
zcard key
zcard salary
(integer) 1
zcount
- 统计出有序集合中介于指定范围之内的成员数量
zcount key min max
zcount salary 0 4000
(integer) 2
zrank
- 可以取得给定成员在有序集合中的排名
zrank key member
zrank salary bob
(integer) 1