Redis
进入redis命令:redis -cli -h localhost
一、什么是redis
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下:
1、字符串类型
2、散列类型
3、列表类型
4、集合类型
5、有序集合类型。
二、redis应用场景
缓存
分布式集群架构中的session分离
聊天室的在线好友列表
任务队列。(秒杀、抢购、12306等等)
应用排行榜
网站访问统计
数据过期处理(可以精确到毫秒)
三、redis与memcache的优缺点
1 、Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
2 、Redis不仅仅支持简单的string类型的数据,同时还提供list,set,hash等数据结构的存储。
3 、Redis支持数据的备份,即master-slave模式的数据备份。
4、内存超出时redis将不常用缓存swap到 磁盘。
5、redis支持集群,添加节点删除节点不丢数据
6、redis是单线程
四、服务器端常用命令
命令 | 描述 | 例子 |
ping | 检查链接是否存活 | ping,返回pong,则存活 |
echo | 在命令行打印内容 | echo context |
info | 获取服务器上的信息和统计 | info |
quit | 退出客户端 | quit |
select | 选择数据库 | select dbno |
dbsize | 返回当前数据库中key的数目 | dbsize |
flushdb | 删除当前数据库中的所有key | flushdb |
flushall | 删除所有数据库中的所有key | flushall |
五.redis的数据类型
一、string类型
命令 | 描述 | 例子 |
set | 赋值 | set key value |
get | 获取值 | get key |
append | 追加字符串 | append key value |
incr | 自增(+1) | incr key |
decr | 自减(-1) | decr key |
incrby | 自增,增加指定步长 | incrby key increment |
decrby | 自减,减少指定步长 | decrby key decrement |
getset | 先获取元素再赋值 | getset key value |
setex | 赋值并指定key的存活时间 | setex key second value |
命令 | 描述 | 例子 |
setnx | key不存在就赋值,否则不做操作 | setnx key value |
strlen | 返回key的值的长度 | strlen key |
setrange | 字符串替换(包含start) | setrange key start value |
getrange | 获取指定位置字符串 | getrange key start end |
mset | 同时设置多个key value | mset key value [key2 value2...] |
mget | 同时获取多个key的值 | mget key [key2...] |
msetnx | key不存在同时设置多个key value,否则不设置 | msetnx key value [key2 value2] |
setbit | 设置二进制的值 | setbit key offset value |
getbit | 获取二进制的值 | getbit key offset |
二、hash类型
命令 | 描述 | 例子 |
hset | 给key中的filed字段赋值 | hset key field value |
hget | 获取可以中filed字段的值 | hget key field |
hexists | 判断key中是否存在filed | hexists key field |
hlen | 获取key中filed的数量 | hlen key |
hdel | 删除key中的filed字段 | hdel key field [field2..] |
hgetall | 获取key中所有的field和value | hgetall key |
hmset | 同时设置多个field和value | hmset key field value [field2 value2..] |
hmget | 同时获取多个field的值 | hmget key field [field2..] |
hsetnx | 如果field不存在赋值,否则不操作 | hsetnx key field value |
hincrby | 给field的值增加指定的步长 | hincrby key field increment |
hkeys | 获取所有的key | hkeys key |
hvals | 获取所有的value | hvals key |
三、list类型
命令 | 描述 | 例子 | |
lpush | 在list头部添加值 | lpush key value [value2..] | |
rpush | 在list尾部添加值 | rpush key value [value2..] | |
lrange | 获取指定位置的数据 | lrange key start end | |
lpop | 从头部弹出key的值(删除) | lpop key | |
rpop | 从尾部弹出key的值(删除) | rpop key | |
rpoplpush | 从一个list的尾部弹出插入到另一个list的头部 | rpoplpush source destnation | |
llen | 返回key的长度 | llen key | |
lrem | 删除前面几个值为value的元素 | lrem key count value | |
lset | 按下标赋值 | lset key index value | |
lindex | 返回下标的值 | lindex key index | |
ltrim | 截取list 指定位置的值 | ltrim key start end | |
linsert | 在某个元素的前面或后面插入值 | linsert key before|after pivot value | |
lpushx | key存在头部添加,否则不做操作 | lpushx key value | |
rpushx | key存在在尾部添加,否则不做操作 | rpushx key value |
四、set类型
命令 | 描述 | 例子 | |
sadd | 添加值 | sadd key member [member2] | |
smembers | 遍历集合 | smembers key | |
scard | 获取key的成员数量 | scard key | |
srem | 删除指定成员 | srem key member [member2..] | |
sismember | 判断成员是否存在 | sismember key member | |
spop | 随机弹出一个值(删除) | spop key | |
命令 | 描述 | 例子 | |
srandmember | 随机弹出一个成员(不删除) | srandmember key | |
smove | 移动一个集合的成员到另一个集合 | smove source destination member | |
sdiff | 求集合的差集 | sdiff key [key2..] | |
sdiffstore | 求集合的差集并存到新集合中 | sdiffstore destination key [key2..] | |
sinter | 求集合交集 | sinter key [key2..] | |
sinterstore | 求集合交集并存到新集合中 | sinterstore destination key [key2..] | |
sunion | 求集合并集 | suion key [key2..] | |
sunionstore | 求集合并集并存到新集合中 | suionstore destination key [key2..] |
五、sorted set类型
1、在集合类型的基础上有序集合类型为集合中的每个元素都关联一个分数,这使得我们不仅可以完成插入、删除和判断元素是否存在在集合中,还能够获得分数最高或最低的前N个元素、获取指定分数范围内的元素等与分数有关的操作。
2有序集合和list类型二者有着很大区别:
1)列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后, 访问中间数据的速度会变慢。
2)有序集合类型使用散列表实现,所有即使读取位于中间部分的数据也很快。
3)列表中不能简单的调整某个元素的位置,但是有序集合可以
4)有序集合要比列表类型更耗内存。
命令 | 描述 | 例子 |
zadd | 添加成员 | zadd key score member [score member..] |
zcard | 获取成员数量 | zcard key |
zcount | 获取指定分数之间的成员数量 | zcount key min max |
zincrby | 给成员增加指定分数 | zincrby key increment member |
zrange | 遍历指定下标之间的成员[及分数](分数从小到大排列) | zrange key start end [withscores] |
zrangebyscore | 遍历指定分数之间的成员(及分数) | zrangebyscore key min max [withscores] |
zrank | 返回成员的下标(分数从小到大排列) | zrank key member |
zrem | 删除指定成员 | zrem key member [member2..] |
zrevrange | 遍历指定成员[及分数](分数从大到小排列) | zrevrange key start end [withscores] |
六、key命令
命令 | 描述 | 例子 | ||
keys | 获取所有的key | keys pattern | ||
del | 删除指定key | del key [key2..] | ||
exists | 判断key是否存在 | exists key | ||
move | 移动一个key到另一个库中 | move key db | ||
rename | 给key重新命名 | rename key newkey | ||
renamenx | 给key重新命名,当newkey存在是不操作 | renamenx key newkey | ||
persist | 将key持久化 | persist key | ||
命令 | 描述 | 例子 | ||
expire | 设置key的存活时间 | expire key sexonds | ||
expireat | 设置key的存活时间(年月日}时间戳 | expireat key timestamp | ||
ttl | 实时查看key的剩余存活时间 | ttl key | ||
pttl | 查看key的剩余存活时间(毫秒) | pttl key | ||
randomkey | 随机返回一个key | randomkey | ||
type | 返回key中的value的类型 | type key | ||
select |
|
|
六.redis的持久化
Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化。
Redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式。可以单独使用其中一种或将二者结合使用。
RDB
RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘。
RDB是Redis默认采用的持久化方式,在redis.conf配置文件中默认有此下配置:
save 900 1
save 300 10
save 60 10000
AOF
以日志形式记录服务器每一个操作,在Redis服务器启动之初会读取该文件来重新构建数据库,以保证启动后数据库中的数据是完整的。
默认情况下Redis没有开启AOF(append only file)方式的持久化,可以通过appendonly参数开启:
appendonly yes
七、RDB持久化方式优劣势:
优势:
1、RDB 是一个非常紧凑(compact)的文件,它保存了Redis在某个时间点上的数据集。这种文件非常适合用于进行备份:可以自己设置保存频率。
2、RDB 非常适用于灾难恢复(disaster recovery):它只有一个文件,并且内容都非常紧凑,可以(在加
密后)将它传送到别的数据中心,或者亚马逊S3 中。
3、 RDB 可以最大化Redis 的性能:父进程在保存RDB文件时唯一要做的就是fork出一个子进程,然
后这个子进程就会处理接下来的所有保存工作,父进程无须执行任何磁盘I/O 操作。
4、 RDB 在恢复大数据集时的速度比AOF的恢复速度要快。
劣势:rdb是以每隔一段时间进行一次快照进行的数据持久,如果一旦在这一时间段出现服务器故障,将会灾难性的。
八.AOF持久化方式优劣势
优势:
1、使用AOF 持久化会让Redis 变得非常耐久(much more durable):你可以设置不同的fsync策略,比如无fsync,每秒钟一次fsync,或者每次执行写入命令时fsync。
2、Redis 可以在AOF 文件体积变得过大时,自动地在后台对AOF进行重写
3、AOF 文件有序地保存了对数据库执行的所有写入操作,这些写入操作以Redis协议的格式保存,因此AOF文件的内容非常容易被人读懂,对文件进行分析(parse)也很轻松。
劣势:
1、对于相同数量的数据集而言,AOF文件通常要大于RDB文件
2、根据所使用的fsync策略,AOF的速度可能会慢于RDB。
九.发布与订阅
发布订阅是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息
SUBSCPIBE:订阅给定一个或多个频道信息(接受)
PUBLISH: 将信息发送到指定的频道(发送)
PUBSUB: 查看订阅与发布系统状态
PUNSUBCRIBE:退订所有给定模式的频道
UNSUBSCRIBE:指退订给定的频道
PSUBSCRIBE: 订阅一个或多个符合给定模式的频道
十.备份与恢复
Config get sace 获取save的值
Config set save 10 4 设置save值
Bgsave 后台备份
十一.安全
默认 requirepass参数是空的
Config set requirepass 密码 设置密码
Config get requirepass 查看密码
AUTH password 设置密码后连接
十二.性能测试
-h 指定服务主机名
-p 指定服务端口
语法 redis-benchmark [option] [option value]
十三.分区
比如多台redis同时用于缓存数据时 怎么确定set的键值对 写哪一台服务器
Hash 取余法
Pushd:改到指定目录
运行jar包Java -Djava.ext.dirs=.\lib -jar testjar
十四.有序集合和list类型
有序集合类型在某些方面和列表类型有些相似。
(1)二者都是有序的。
(2)二者都可以获得某一范围的元素。
但是二者有着很大的区别,这使得它们的应用场景也是不同的。
(1)列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会较慢,所以它更加适合实现如“新鲜事”或“日志”这样很少访问中间元素的应用。
(2)有序集合类型是使用散列表和跳跃表(Skip list)实现的,所以即使读取位于中间部分的数据速度也很快(时间复杂度是O(log(N)))。
(3)列表中不能简单地调整某个元素的位置,但是有序集合可以(通过更改这个元素的分数)。
(4)有序集合要比列表类型更耗费内存。有序集合类型算得上是 Redis的5种数据类型中最高级的类型了,在学习时可以与列表类
型和集合类型对照理解。