默默学REDIS(一) 基本介绍

当下Redis火热,应该是个程序员都听过Redis了。这里本人也对其学习一下。

Redis(REmote DIctionary Server)是一个key-value的存储系统,基于内存也可持久化使它高效,且减少数据丢失,并提供多种语言的API。

Redis特点:
● Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
● Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
● Redis支持数据的备份,即master-slave模式的数据备份。
Redis优势:
● 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
● 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
● 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

Redis安装,这里就不介绍了,随便查一堆。

参数说明:

参数 默认值 描述
daemonize no 是否使用守护进程运行
pidfile /var/run/redis.pid 如果以守护进程运行,则pid将记录在pidfile文件中
port 6379 监听端口
bind 127.0.0.1 绑定地址
timeout 0 客户端连接闲置多长时间关闭,0则永不关闭
loglevel verbose 默认日志等级
logfile 日志输出文件,非守护进程时,日志存储到/dev/null
databases 16 databases数量,可以通过SELECT 命令在连接上指定数据库id。默认连0
save save 900 1
save 300 10
save 60 10000
指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
rdbcompression yes 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
dbfilename dump.rdb 本地数据库文件名
dir ./ 数据文件目录
slaveof 当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
masterauth 当master服务设置了密码保护时,slav服务连接master的密码
requirepass 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH 命令提供密码,默认关闭
maxclients 设置同一时间最大客户端连接数,默认无限制
maxmemory 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
appendonly no 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。
appendfilename appendonly.aof 指定更新日志文件名,默认为appendonly.aof
appendfsync everysec no:表示等操作系统进行数据缓存同步到磁盘(快)
always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
everysec:表示每秒同步一次(折衷,默认值)
vm-enabled no 指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中
vm-swap-file /tmp/redis.swap 虚拟内存文件路径
vm-max-memory 0 将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘
vm-page-size 32 Redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的 数据大小来设定的,如果确定存储大对象,可以调大此数值
vm-pages 134217728 设置swap文件中的page数量,由于页表是在放在内存中的,在磁盘上每8个pages将消耗1byte的内存。
vm-max-threads 4 设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。
glueoutputbuf yes 设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启
hash-max-zipmap-entries 64 指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法
hash-max-zipmap-value 512
activerehashing yes 指定是否激活重置哈希,默认为开启
include 指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件

redis支持的数据结构有,string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合),对这些数据结构操作的命令分别为:
String:
SET key value
GET key

Hash:
HMSET hash field1 value1 field2 value2
HGET hash field1
HGET hash field2

List:
LPUSH list value1
LPUSH list value2
LPUSH list value3
LRANGE list 0 3

Set:
SADD set value1
SADD set value2
SADD set value3
SMEMBERS set

ZSet:
ZADD set score1 value1
ZADD set score2 value2
ZADD set score3 value3
ZRANGEBYSCORE set 0 100

类型 简介 特性 场景
String(字符串) 二进制安全 可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M
Hash(字典) 键值对集合,即编程语言中的Map类型 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去) 存储、读取、修改用户属性
List(列表) 链表(双向链表) 增删快,提供了操作某一段元素的API 1,最新消息排行等功能(比如朋友圈的时间线) 2,消息队列
Set(集合) 哈希表实现,元素不重复 1,添加、删除,查找的复杂度都是O(1) 2,为集合提供了求交集、并集、差集等操作 1,共同好友 2,利用唯一性,统计访问网站的所有独立ip 3,好用推荐时,根据tag求交集,大于某个阈值就可以推荐
Sorted Set(有序集合) 将Set中的元素增加一个权重参数score,元素按score有序排列 数据插入集合时,已经进行天然排序 1,排行榜 2,带权重的消息队列

命令参考:https://redis.io/commands

REDIS命令:

PING MESSAGE 用于检测服务端
DEL key 删除key
DUMP key 序列化指定的key
EXISTS key key是否存在
EXPIRE key seconds 给指定的key设置过期时间
EXPIREAT key timestamp 指定时间戳过期
PEXPIRE key milliseconds 指定key过期时间,毫秒
PEXPIREAT key milliseconds-timestamp 设置 key 过期时间的时间戳(毫秒)
KEYS pattern 查找所有符合(pattern)的key
MOVE key db 将当前数据库的key移到指定的db中
PERSIST key 移除key的过期时间,key将持久保持
PTTL key 返回key的剩余过期时间(毫秒)
TTL key 返回key剩余时间(秒)
RANDOMKEY 从当前随机返回一个key
RENAME key newkey 修改key名称
RENAMENX key newkey 仅当newkey不存在时,将key改成newkey
TYPE key 返回key对应的value数据类型

字符串命令:

SET key value 设置指定key的值
GET key 获取指定key的值
GETRANGE key start end 获取key中字符串的子字符
GETSET key value 设置指定key的值,并返回old值
GETBIT key offset 对key所存储的字符串值,获取指定偏移量的位
MGET key1 key2… 获取所有给定key的值
SETBIT key offset value 对key所存储的字符串,设置或清除指定偏移量上的位
SETEX key seconds value 将值value关联到key,并将key的过期时间设置seconds秒
SETNX key value 只有当key不存在时设置值
SETRANGE key offset value 用value参数覆盖给定的key所存储的字符串,从偏移量offset开始
STRLEN key 返回key所存储的字符串长度
MSET key value key value 同时设置一个或多个key-value
MSETNX key value key value 同时设置一个或多个key-value,当且仅当所有给定的key都不存在
PSETEX key milliseconds value 毫秒,与SETEX一样
INCR key 将key值中存储的数字增一
INCRBY key increment 将key所存储的数字增加给定的值
INCRBYFLOAT key increment 如上,增加浮点值
DECR key 将key值中存储的数字减一
DECRBY key decrement 将key所存储的数字减去给定的值
APPEND key value 如果key已经存在且是一个字符串,value追加

Hash命令:

HDEL key field1 field2 删除一个或多个哈希表字段
HEXISTS key field 查看哈希表key中,指定的字段是否存在
HGET key field 获取存储在哈希表中指定字段
HGETALL key 获取key的所有字段和值
HINCRBY key field increment 为哈希表key中的字段的整数值增加increment
HINCRBYFLOAT key field increment 同上,float值
HKEYS key 获取哈希表所有的字段
HLEN key 获取哈希表字段个数
HMGET key field1 field2 获取所有给定字段的值
HMSET key field1 value1 field2 value2 同时设置多个field-value
HSET key field value 设置field-value
HSETNX key field value 只有field不存在时,设置值
HVALS key 获取哈希表中所有的值
HSCAN key cursor pattern count 迭代哈希表中的键值对

List命令:

BLPOP key1 key2… timeout 移出并获取列表第一个元素,如果列表没有元素则阻塞超时或者等待有元素
BRPOP key1 key2… timeout 移出并获取列表最后一个元素,如果列表没有元素则阻塞超时或者等待有元素
BRPOPLPUSH source destination timeout 从列表中弹出一个值,并插入到另一个列表中。如果列表没有元素则等待。
LINDEX key index 根据索引获取值
LINSERT key BEFORE/AFTER pivot value 在列表的前或后插入元素
LLEN key 获取列表长度
LPOP key 获取第一个元素
LPUSH key value1 value2.. 将一个或多个值插入到列表头部
LPUSHX key value 将一个值插入已经存在的列表头部
LRANGE key start stop 返回列表范围元素
LREM key count value 移除列表元素
LSET key index value 通过索引设置列表元素的值
LTRIM key start stop 对列表进行修剪,就是说,让列表只保留指定区间内的元素,其他的移除
RPOP key 获取最后一个元素
RPOPLPUSH source destination 移除最后一个元素,加到另一个列表
RPUSH key value1 value2.. 将一个或多个值插入到列表尾部
RPUSHX key value 为已经存在的列表添加值到尾部

Set命令:

SADD key member1… 向集合添加一个或多个元素
SCARD key 集合元素个数
SDIFF key1 key2 返回集合差集
SDIFFSTORE destination key1 key2 返回差集并存在destionation中
SINSERT key1… 返回所有集合的交集
SINSERTSTORE destination key1… 返回所有集合的交集并存入destionation中
SISMEMBER key member 判断member元素是否是集合的成员
SMEMBER key 返回集合所有元素
SMOVE source destination member 将元素member从source移到destination中
SPOP key 随机移除一个元素,并返回
SRANGEMEMBER key count 返回集合一个或多个元素(随机)
SREM key member1 member2 移除集合一个或多个元素
SUNION key1… 返回所有集合的并集
SUNIONSTORE destination key1… 返回所有集合的并集存入destination中
SSCAN key cursor pattern count 迭代集合的元素

有序集合:

ZADD key score1 member1 .. 向有序集合中添加一个或多个元素
ZCARD key 获取有序集合成员数
ZCOUNT key min max 获取有序集合分数区间的成员数
ZINCRBY key increment member 有序集合某成员分数增加increment
ZINTERSTORE destination numkeys key… 计算一个或多个有序集合的交集结果存储在新的有序集合中
ZLEXCOUNT key min max 获取有序集合字典区间的成员数
ZRANGE key start stop 通过索引区间返回有序集合的成员
ZRANGEBYLEX key min max 通过字典区间返回有序集合的成员
ZRANGEBYSCORE key min max 通过分数区间返回有序集合的成员
ZRANK key member 返回有序集合中指定成员的索引
ZREM key member… 移除有序集合中的一个或多个成员
ZREMRANGEBYLEX key min max 移除字典区间的所有有序集合的成员
ZREMRANGEBYRANK key start stop 移除索引区间的所有有序集合的成员
ZREMRANGEBYSCORE key min max 移除分数区间的所有有序集合的成员
ZREVRANGE key start stop 返回索引范围内的成员,分数从高到底
ZREVRANGEBYSCORE key max min 返回指定分数区间内的成员,分数从高到底
ZREVRANK key member 返回有序集合指定成员的排名,按分数
ZSCORE key member 返回成员分数
ZUNIONSTORE destination numkeys key… 计算一个或多个有序集合的并集,并存储在新的有序集合中
ZSCAN key cursor pattern count 迭代有序集合中的成员

HyperLogLog 用于做基数统计:

PFADD key element… 添加元素
PFCOUNT key 返回基数预估值
PFMERGE destkey sourcekey… 多个HyperLogLog合成一个

Redis支持消息的订阅/通知模型:
SUBSCRIBE channel… 订阅一个或多个频道
UNSUBSCRIBE channel… 退订一个或多个频道
PUBLISH channel message 推送消息至指定频道
PUBSUB subcommand arg… 查看订阅和发布系统的状态
PSUBSCRIBE pattern… 订阅一个或多个符合给定模式的频道
PUNSUBSCRIBE pattern… 退订一个或多个给定模式的频道

REDIS事务可以一次性执行多个任务,一个REDIS事务主要特征:
● 批量操作在发送EXEC命令前被放入队列缓存
● 收到EXEC命令后进行事务执行,事务中任意命令执行失败,其余的命令依然被执行
● 在事务执行过程,其余客户端提交的命令请求不会插入到事务执行命令序列中
命令:
MULTI 标记事务开始
EXEC 执行所有事务块内的命令
DISCARD 取消事务
WATCH key… 监视一个或多个key,如果事务执行之前这个key被其他命令所修改,那么事务将被打断
UNWATCH 取消WATCH命令对key的监视

脚本:
执行脚本:
EVAL script numkeys key… arg…
EVALSHA sha1 numkeys key… arg…
查看脚本:
SCRIPT EXISTS script… 查看指定脚本是否存在
SCRIPT LOAD script 加载脚本
SCRIPT KILL 杀死正在运行的脚本
SCRIPT FLUSH 移除所有的脚本

猜你喜欢

转载自blog.csdn.net/caohao1210/article/details/81183474