redis
来源:互联网 发布:用vb设计计算机程序 编辑:程序博客网 时间:2024/05/19 16:07
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种数据类型中最高级的类型了,在学习时可以与列表类
型和集合类型对照理解。
- Redis
- redis
- Redis
- redis
- Redis
- redis
- Redis
- redis
- REDIS
- Redis
- Redis
- redis
- Redis
- Redis
- Redis
- Redis
- Redis
- Redis
- 2017.11.26
- Spark on Yarn遇到的几个问题
- 初写Makefile
- Kubernetes
- XShell连接CentOS显示完整终端名
- redis
- python中封装、继承与多态
- 数据结构
- css中的@keyframes规则实现物体的运动
- Bit String Reordering UVALive
- HDOJ-2602 Bone Collector(背包DP)
- 关于虚拟机VM0,1,8的总结以及宿主机无法ping通虚拟机和虚拟机无法ping通外网的问题总结
- 欢迎使用CSDN-markdown编辑器
- 目前java序列化流行的编解码框架