Redis
1、 数据库类型:
1、关系型数据库sql:操作数据库必须使用sql语句,数据存在磁盘:mysql,存储数据量大
2、非关系型数据库nosql:操作时不需要使用sql语句,数据默认存储在内存:速度快,效率高,存储数据量小,不需要数据库表,以键值对存储的
2、关系/非关系型数据库搭配使用
DDBMS:关系型数据库
1、所有数据存储在关系型数据据库
2、客户端访问服务器,有一些数据,服务器需要频繁的查询数据
服务器首先将数据从关系型数据库中读出------>第一次
将数据写入到redies当中
客户端第二次包含以后访问服务器,从redies中读取数据
3、redis两个角色
1)服务器启动
redis-server
redis-server confFilename//根据配置文件配置启动
2)客户端启动
redis-cli:默认链接本地,绑定6379端口的服务器
redis-cli -p 端口号
redis-cli -h IP地址 -p 端口号:链接远程主机指定端口的redis
3)通过客户端关闭服务器
shutdown
4)客户端测试命令
ping [message]
4、redis中数据格式
键值对:key值必须是字符串-----"hello"
value值可选:
String类型
List类型
Set类型
SortedSet类型
Hash类型
5、redis常用数据类型
- String类型:字符串
- List类型:存储多个string字符串的(更像一个数组)
- Set类型:redis集合:元素不重复, 数据是无序的
- SortedSet类型:排序集合, 集合中的每个元素分为两部分 :[分数, 成员] -> [66, ''tom'']
- Hash类型:跟map数据组织方式一样: key:value Qt -> QHash, QMap Map -> 红黑树 hash -> 数组 a[index] = xx
6、redis常用命令
String类型
1、key--->string
value--->string
#设置一个键值对string:string
SET key value
#通过key值取value
GET key
#同时设置一个或多个key-value 对
MSET key value [key value ...]
#返回所有(一个或多个) 给定key 的值
MGET key [key ...]
#如果key 已经存在并且是一个字符串,APPEND 命令将value 追加到key 原来的值的末尾。
#如果key 不存在,APPEND 就简单地将给定key 设为value ,就像执行SET key value 一样
APPEND key value
#返回key 所储存的字符串值的长度。
#当key 储存的不是字符串值时,返回一个错误。
STRLEN key
#将key 中储存的数字值减一。
#如果key 不存在,那么key 的值会先被初始化为0 ,然后再执行DECR 操作。
#如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
DECR key
#将key 中储存的数字值增一。
#如果key 不存在,那么key 的值会先被初始化为0 ,然后再执行INCR 操作。
#如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
INCR key
#将key 所储存的值减去减量decrement 。
#如果key 不存在,那么key 的值会先被初始化为0 ,然后再执行DECRBY 操作。
#如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
DECRBY key decrement
#将key 所储存的值加上增量increment 。
#如果key 不存在,那么key 的值会先被初始化为0 ,然后再执行INCRBY 命令。
#如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
INCRBY key increment
2、list类型---存储多个字符串
key--->string
value--->list
#将一个或多个值value 插入到列表key 的表头,如果有多个value 值,那么各个value 值按从左到右的顺序依次插入到表头
LPUSH key value [value ...]
#将一个或多个值value 插入到列表key 的表尾(最右边),如果有多个value 值,那么各个value 值按从左到右的顺序依次插入到表尾
RPUSH key value [value ...]
#如果key 不存在,一个空列表会被创建并执行RPUSH,LPUSH操作
#返回列表key 中指定区间内的元素,区间以偏移量start 和stop 指定。
#下标(index) 参数start 和stop 都以0 为底,也就是说,以0 表示列表的第一个元素,以1 表示列表的
#第二个元素,以此类推。
#你也可以使用负数下标,以-1 表示列表的最后一个元素,-2 表示列表的倒数第二个元素,以此类推。
LRANGE key start stop
#移除并返回列表key 的头元素
LPOP key
#移除并返回列表key 的尾元素
RPOP key
#返回列表key 中,下标为index 的元素。
#下标(index) 参数start 和stop 都以0 为底,也就是说,以0 表示列表的第一个元素,以1 表示列表的
#第二个元素,以此类推。
#你也可以使用负数下标,以-1 表示列表的最后一个元素,-2 表示列表的倒数第二个元素,以此类推。
LINDEX key index
#返回列表key 的长度
LLEN key
#根据参数count 的值,移除列表中与参数value 相等的元素。
count 的值可以是以下几种:
• count > 0 : 从表头开始向表尾搜索,移除与value 相等的元素,数量为count 。
• count < 0 : 从表尾开始向表头搜索,移除与value 相等的元素,数量为count 的绝对值。
• count = 0 : 移除表中所有与value 相等的值。
LREM key count value
3、set 类型
key--->string
value--->set类型{"string","string",...}
将一个或多个member 元素加入到集合key 当中,已经存在于集合的member 元素将被忽略。
假如key 不存在,则创建一个只包含member 元素作成员的集合
SADD key member [member ...]
返回集合key 中的所有成员。
不存在的key 被视为空集合。
SMEMBERS key
返回一个集合的全部成员,该集合是所有给定集合之间的差集。
SDIFF key [key ...]
返回一个集合的全部成员,该集合是所有给定集合的交集。
不存在的key 被视为空集。
当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)。
SINTER key [key ...]
返回一个集合的全部成员,该集合是所有给定集合的并集。
不存在的key 被视为空集。
SUNION key [key ...]
移除集合key 中的一个或多个member 元素,不存在的member 元素会被忽略。
SREM key member [member ...]
移除并返回集合中的一个随机元素。
SPOP key
4、sortedset排序集合
key--->string
value--->sorted ([score,member],[score,member].....)
将一个或多个member 元素及其score 值加入到有序集key 当中。
如果某个member 已经是有序集的成员,那么更新这个member 的score 值,并通过重新插入这个member
元素,来保证该member 在正确的位置上。
score 值可以是整数值或双精度浮点数。
如果key 不存在,则创建一个空的有序集并执行ZADD 操作。
ZADD key score member [[score member] [score member] ...]
返回有序集key 中,指定区间内的成员。
其中成员的位置按score 值递增(从小到大) 来排序。
具有相同score 值的成员按字典序(lexicographical order ) 来排列。
start,end和之前一样
ZRANGE key start stop [WITHSCORES]
降序排列
ZREVRANGE key start stop [WITHSCORES]
返回有序集key 中,score 值在min 和max 之间(默认包括score 值等于min 或max ) 的成员的数量。
ZCOUNT key min max
返回有序集key 中成员member 的排名。其中有序集成员按score 值递增(从小到大) 顺序排列。
排名以0 为底,也就是说,score 值最小的成员排名为0 。
ZRANK key member
逆序排列
ZREVRANK key member
移除有序集key 中的一个或多个成员,不存在的成员将被忽略。
ZREM key member [member ...]
ZSCORE key member
返回有序集key 中,成员member 的score 值。
5、哈希hash
key--->string
value--->hash([key:value],[key,value]....)
HSET key field value
将哈希表key 中的域field 的值设为value 。
如果key 不存在,一个新的哈希表被创建并进行HSET 操作。
如果域field 已经存在于哈希表中,旧值将被覆盖。
HMSET key field value [field value ...]
同时将多个field-value (域-值) 对设置到哈希表key 中。
此命令会覆盖哈希表中已存在的域。
如果key 不存在,一个空哈希表被创建并执行HMSET 操作。
HGET key field
返回哈希表key 中给定域field 的值。
HMGET key field [field ...]
返回哈希表key 中,一个或多个给定域的值。
如果给定的域不存在于哈希表,那么返回一个nil 值。
HDEL key field [field ...]
删除哈希表key 中的一个或多个指定域,不存在的域将被忽略。
HEXISTS key field
查看哈希表key 中,给定域field 是否存在。
HGETALL key
返回哈希表key 中,所有的域和值。
在返回值里,紧跟每个域名(field name) 之后是域的值(value),所以返回值的长度是哈希表大小的两倍。
HINCRBY key field increment
为哈希表key 中的域field 的值加上增量increment 。
增量也可以为负数,相当于对给定域进行减法操作。
如果key 不存在,一个新的哈希表被创建并执行HINCRBY 命令。
如果域field 不存在,那么在执行命令前,域的值被初始化为0 。
对一个储存字符串值的域field 执行HINCRBY 命令将造成一个错误。
HLEN key
返回哈希表key 中域的数量
HVALS key
返回哈希表key 中所有域的值。
6、Key值相关
DEL key [key ...]
删除给定的一个或多个key 。
不存在的key 会被忽略。
KEYS pattern
查找所有符合给定模式pattern 的key 。
KEYS * 匹配数据库中所有key 。
KEYS h?llo 匹配hello ,hallo 和hxllo 等。
KEYS h*llo 匹配hllo 和heeeeello 等。
KEYS h[ae]llo 匹配hello 和hallo ,但不匹配hillo 。
特殊符号用\ 隔开
EXISTS key
检查给定key 是否存在。
EXPIRE key seconds
为给定key 设置生存时间,当key 过期时(生存时间为0 ),它会被自动删除。
TTL key
以秒为单位,返回给定key 的剩余生存时间(TTL, time to live)。
当key 不存在时,返回-2 。
当key 存在但没有设置剩余生存时间时,返回-1 。
否则,以秒为单位,返回key 的剩余生存时间。
PERSIST key
移除给定key 的生存时间,将这个key 从『易失的』(带生存时间key ) 转换成『持久的』(一个不带生存时
间、永不过期的key )。
TYPE key
返回key 所储存的值的类型。
7、redis配置文件
配置文件是针对服务器的
1、位置
源码安装位置 redis.conf:启动时指定conf
# redis服务器绑定谁之后, 谁就能访问redis服务器
# 任何客户端都能访问服务器, 需要注释该选项
bind 127.0.0.1 192.168.1.100
# 保护模式, 如果要远程客户端访问服务器, 该模式要关闭
protected-mode yes
# reids服务器启动时候绑定的端口, 默认为6379
port 6379
# 超时时长, 0位关闭该选项, >0则开启
timeout 0
# 服务器启动之后不是守护进程
daemonize no
# 如果服务器是守护进程, 就会生成一个pid文件
# ./ -> reids服务器启动时候对应的目录
pidfile ./redis.pid
# 日志级别
loglevel notice
# 如果服务器是守护进程, 才会写日志文件
logfile "" -> 这是没写
logfile ./redis.log
# redis中数据库的个数
databases 16
- 切换 select dbID [dbID == 0 ~ 16-1]
8、redis持久化
持久化:数据从内存到磁盘的过程
持久化的两种方式:
rdb方式
这是一种默认的持久化方式, 默认打开
磁盘的持久化文件xxx.rdb
将内存数据以二进制的方式直接写入磁盘文件
文件比较小, 恢复时间短, 效率高
以用户设定的频率 -> 容易丢失数据
数据完整性相对较低
aof方式
默认是关闭的
磁盘的持久化文件xxx.aof
直接将生成数据的命令写入磁盘文件
文件比较大, 恢复时间长, 效率低
以某种频率 -> 1sec
数据完整性高
# rdb的同步频率, 任意一个满足都可以
save 900 1
save 300 10
save 60 10000
# rdb文件的名字
dbfilename dump.rdb
# 生成的持久化文件保存的那个目录下, rdb和aof
dir ./
# 是不是要打开aof模式
appendonly no
-> 打开: yes
# 设置aof文件的名字
appendfilename "appendonly.aof"
# aof更新的频率
# appendfsync always
appendfsync everysec
# appendfsync no
1、aof和rdb能同时打开
2、aof和rdb能同时关闭:关闭rdb: save ""//不设置就关了
3、两种模式同时开启, 如果要进行数据恢复, 如何选择?
效率上考虑: rdb模式
数据的完整性: aof模式
接口文档:去官方网址下载:编译安装