Redis
一:初识Redisredis
一、Redis 是什么? 数据库
一款开源的基于C语言的内存的键值对存储数据库,支持多种数据结构如:Set、hash、List、Zset、等,高性能的内存数据库。编程
二、Redis 特性 速度快 (10W Ops、单线程)
持久化 (可异步保存到磁盘,断电后不丢失数据)
多种数据结构
支持多种编程语言
功能丰富
简单
主从复制
高可用、分布式json
三、应用场景 缓存
缓存、计数器、消息队列、排行榜、社交网络、实时系统、会话存储、服务器
四、安装 官方地址:https://redis.io/download
$ wget http://download.redis.io/releases/redis-5.0.4.tar.gz
$ tar xzf redis-5.0.4.tar.gz
$ cd redis-5.0.4
$ make
运行服务端
$ src/redis-server
客户端访问
$ src/redis-cli
备注: 能够创建一个软链接以备后续升级: ln -s redis-5.0.4 redis网络
五、启动方式 简单启动 sh 、动态参数启动、配置文件启动
默认端口:6379
中止方式为:shoutdown 这样Redis能够保存相关操做后再进行关闭。
指定修改后的conf启动:/opt/software/redis-5.0.4/src/redis-server /opt/software/redis-5.0.4/redis.conf
配置文件修改:
关闭默认本地访问:#bind 127.0.0.1
关闭守护进程:protected-mode no
设置访问密码:requirepass password
本机访问 src/redis-cli 链接后输入验证:auth root数据结构
六、Redis经常使用配置 app
daemonize 是否守护进程(no/yes)修改为yes 能够进行日志记录
port 设置对外访问端口默认:6379
logfile: 日志名称,记录日志
dir:Redis工做目录异步
七、通用命令
keys * (获取全部key)、
dbsize(获取数据库大小)、
exists key(判断当前key是否存在)
del key[key] (删除key)
expire key seconds(设置过时时间)
type key (判断类型)
ttl key(查询剩余过时时间)
persist key (去除过时时间)
scan循环遍历
flushall 清除全部key value
八、名词:
往返延迟:①客户端向服务器发送指令;②服务端接收指令,存储到执行队列;③服务器开始执行指令;④服务器返回执行结果;整个系列中的总耗时称之为往返延迟。
2、数据类型
一、String
key key1 value val{类型能够是:字符、数字(整数、浮点数)、bits、json、xml}
单个最大512MB。尽可能控制在100kb
一、1:经常使用操做 i
ncr key :自增1; 若是key不存在增长后值为 1;
decr key :自减1: 若是key 不存在自减后为 -1;
incrby key k:key增长k;若是不存在增长后为k;
decrby key k:key减去k:若是不存在自减后为-k;
setnx key value :当key不存在时进行新增;成功返回1,失败返回0
set key value xx :当key存在时进行从新赋值,相似更新操做
mset key1 value1 key2 value2 key3 value3 : 批量设置值
mget key1 key2 key3 : 批量取值
getset key:先返回原有值;在进行更新值
append :追加操做,若是键不存在会先增长后返回
strlen :获取字符串长度(注意中文两个字节)
incrbyfloat:增长对应key浮点数
getrange:获取指定字符串下标的值
setrange:设置指定字符串下标的值,相似替换操做
[总结]
①:Redis内部编码
int:用于长度小于64位有符号整数表示的字符串<数字类型的字符串>
embstr: 用于长度小于等于44字节的字符串;这种类型的编码在内存使用和性能方面更有效率
raw:用于长度大于44字节的字符
②:字符串能够存储普通的字符、整数、浮点数;若是存入的value 能够被转换为整数或浮点数,则可使用incr、decr、incrby、decrby;若是对字符进行增减,则会返回错误异常,若是值为空则当作0处理。
③:getrange key start end 当范围值strlen key超出当前长度,则直接返回字符末端。
④:setrange key index value 当在指定index上对应一个长度value则只修改指定index,若是value长度不为1则覆盖其指定位置后其它value,超出部分会直接替换进去。
二、hash 哈希
2.一、经常使用操做
hget key field : 获取 键map中指定字段的属性值
hset key field value: 设置 键map中指定字段的属性值;当map中的field已存在时使用重复field可覆盖value
hdel key field : 删除 键map中指定字段的属性值
hgetall key : 获取key哈希表全部属性包含:字段名、字段属性值<注意不要滥用:redis是单线程>
hkeys key : 获取key中全部字段名称
hvals key : 获取key中全部值
hexists key field : 判断指定列表中某个字段是否存在
hlen:计算指定key哈希的长度;注意返回字段属性长度
hmset key1 field1 value1 field2 value2 field3 value3:批量设置值
hmget key1 field1 field2 :批量取值
hsetnx key value :当key不存在时进行新增;成功返回1,失败返回0
hset key value xx :当key存在时进行从新赋值,相似更新操做
hincrby 自增
hincrbyfloat 浮点数增长
三、list列表
三、1:经常使用操做
’rpush keylist value1 value2 value3 : 从当前列表的value右侧开始插入数据 ===>>>value一、value二、value3
lpush keylist value1 value2 vlaue3 : 从当前列表的value左侧开始插入数据 ===>>>value三、value二、value1
linsert keylist befor|after value newValue :在当前列表value值以前插入仍是以后插入数据
lpop keylist : 从左边删除一个元素
rpop keylist : 从右边删除一个元素
lrem keylist 0|1|-1 value: 删除列表中值等与value的相同元素;0 全部;1从左到右;-1从右到左
ltrim keylist start end : 列表修剪,只保留当前keylist中start到end之间的元素,其中start与end会被保留
lrande keylist start end : 获取列表从右到左指定范围内的值,包含start与end对应坐标值会返回
lindex keylist index : 获取指定下标的值
llen keylist : 获取列表长度
lset keylist index newValue: 更新指定下标值
备注:0~ -1 范围内返回的是整个列表。
四、set无序集合
特色:集合不容许重复,集合内元素无序,支持集合间操做(交集、并集、差集)
集合排序分值相等会按照名称进行排序;key不能够重复,value 能够重复(重复后会替换原有值)
四、1:经常使用操做 sadd key element(多个元素):增长元素
srem key element :删除元素
scard key: 计算集合元素个数
sismember key: 判断值是否存在
srandmember key: 从集合中随机取出一个或多个元素;参数:[count] 当count为正数随机返回元素不会重复;当count为负数时随机返回元素可能会出现重复值
smembers key: 取出集合全部元素
spop key:从集合中随机移除一个元素,并返回被移除的元素
smove key1 key2: 若是key1中存在element那么从key1中移除element,并将element添加至key2中成功返回1;失败返回0
四、2:集合间操做 sinter key1 [key2,key3...]: 求交集;返回同时存在第一个集合,而又存在于其它集合中的元素。
sinterstore desc_key1 key1[key2,key3...]: 求交集;将同时存在全部集合中的元素,存储到desc_key1集合中。
sdiff :求差集
sdiffstore desc_key1 key1[key2,key3...]: 求差集;将只存key而不存在其它集合中的元素,存储到desc_key1集合中。
sunion :求并集
sunionstore desc_key1 key1[key2,key3...]: 求并集;将至少存在一个元素中的值,存储到desc_key1集合中。(不含重复值)
五、sorted set有序集合
特色:不容许重复,集合内元素有序。存在分值排序。形式 key score element;集合排序分值相等会按照名称进行排序;
key不能够重复,value 能够重复(重复后会替换原有值)
五、1:经常使用操做
zadd key score element: 增长元素score 能够重复
zrem key element :从指定集合中移除指定元素,并返回移除个数。
zscore key element:获取指定集合中元素的分数
zincerby key increscore element:自增,自减分值
zcard key :返回集合元素个数
zrank key element: 获取元素排名;排名规则是根据分支score 从小到大--->>>0-100排序规则。
zrange key start end :获取指定范围内排名的值:指定范围内排序规则是升序。从低到高
zrangebyscore key minScore maxScore 获取指定分数内的元素值,从低到高
zcount key minScore MAxScore 获取指定分数内的元素个数
zremrangebyrank key start end :移除指定集合中排名介于start至end之间的全部成员 zremrangebyrankkey 0 -4<减去第四个>
zremrangebyscore key minScore maxScore : 移除指定集合中分数介于minScore至maxScore之间的全部成员
五、2:其它操做
zrevrank key element: 获取指定集合key中指定元素element的排名;排名从高到低
zrevrange key start end :获取指定范围内排名的值:指定范围内排序规则是升序。从高到低
zrevrangebyscore key minScore maxScore 获取指定分数内的元素值,从高到低
zinsterstore desc_key1 key1[key2,key3] :对指定集合进行交集运算,key返回一个新的集合
zunionstore desc_key1 key1[key2,key3] :对指定集合进行并集运算,key返回一个新的集合
六、HyperLogLog 惟一计数
特色:当数据量达到千万等级别的时使用HyoerLogLog所消耗的内存较小
六、1:经常使用操做 pfadd key value: 增长元素
pfcount key : 获取key 去重复值统计
pfmerge newKey key1 key2 :合并两个key 产生汇总集合。
六、2:其它操做
七、geo 地理位置
特色:存储基于地理信息坐标的集合
七、1:经常使用操做
e maxScore 获取指定分数内的元素值,从高到低
zunionstore 有序集合合并
八、pipeline : 批量执行,能够一次性执行一批get/set 命令;pipeline只适用于单节点
conn.pipelined(true|false); true 使用事务执行;false不开启事务执行
示例:
public void updateTokenPipeline(Jedis conn, String token, String user, String item) {
long timestamp = System.currentTimeMillis() / 1000;
Pipeline pipe = conn.pipelined(false);
pipe.multi();
pipe.hset("login:", token, user);
pipe.zadd("recent:", timestamp, token);
if (item != null){
pipe.zadd("viewed:" + token, timestamp, item);
pipe.zremrangeByRank("viewed:" + token, 0, -26);
pipe.zincrby("viewed:", -1, item);
}
pipe.exec();
}
九、过时时间:
persist key:移除过时时间 ttl key //查看给定键距离过时还有多少秒 查询结果 -1 没有设置过时时间;-2 已通过期
expire "key" time:设置过时时间《单位:秒》
expireat key timestamp :将给定的键的过时时间设置为unix时间戳
pttl key: 查看给定键过时时间还有多少毫秒
pexpire key milliseconds :让给定键在指定的毫秒后过时
pexpireat key : 将一个毫秒级的unix时间戳设置为给定的过时时间
当键的值被:set、getset、*store在内的命令,键的过时时间会被清除。
当被一个重名的key,会冲掉过时时间。
十、排序sort
sort key [BY pattern]
[LIMIT offset count] //限制排序返回数量 offset开始下标 count返回数量
[GET pattern [GET pattern ...]]
[ASC|DESC] //ASC 默认升序 | desc 降序
[ALPHA] //费字符排序
[STORE destination] //按照权重排序
十一、发布与订阅
subscribe channel [channel ...] 订阅给定的一个或多个频道
unsubscribe channel [channel ...] 退订一个或多个频道
publish channel message 向给定的一个频道发送消息
psubscribe pattern [pattern ...] 订阅与给定模式匹配的全部频道
punsubscribe pattern [pattern ...] 退订给定模式,若是执行时没有给定任何模式,那么退订全部模式
十二、事务概念
redis的基本事务涉及到MULTI(开始)、EXEC(结束);还有WATCH、UNWATCH、DISCARD
执行流程:MULTI : 逐条操做;EXEC 结束;当redis接收到multi命令时会将以后的每一条操做都存放到队列中去;直到接收到exec结束;
开始执行每条操做;遇到错误所有回滚
3、持久化
一、快照(Snapshotting)
能够在某一时刻将全部数据所有写入硬盘
二、只追加文件(AOF)
只有当执行写入命令才进行磁盘写入。
0、RDB 快照
RDB持久化方式;redis在本地生成一份RDB二进制文件,当须要恢复数据,或持久化到数据库时,可以使用RDB文件进行。
1.一、生成RDB文件的三种方式:
save: 在执行数据返回前首先保存至本地RDB文件中,而后进行结果返回。(同步执行),数据量较大容易形成单线程阻塞。执行策略,当本地已经存在RDB文件时,生成一份新的文件,以后替换旧的RDB文件。
bgsave: 执行完Redis操做直接返回,异步进行更新本地RDB文件。(异步执行),生成一个fork()子进程执行保存。
自动:定时进行更新本地RDB文件。须要知足下列条件之一后执行:
配置 seconds changes
save 900s 1条
save 300s 10条
save 60s 1000条
修改配置: redis.conf dbfilename dump.rdb 修改默认文件名 dir ./ 修改默认存储文件夹 stop-writes-on-bgsave-erroe yes --------------------------------------------------------------未完待续,20190706