Redis是什么?
REmote Dictionary Server(Redis)是一个由Salvatore Sanfilippo写的key-value存储系统。
优点:
能支持超过100K+每秒的读写频率。
安装:
实验楼(省略)
使用:
Sudo service reds-server start
redis-cli
>set mykey somevalue
>get mykey
可以用set和get来创建和检索strings
可以对已有的key重新赋值:
>set mykey newval nx
>set mykey newval xx
加法器:
>set counter 100
>incr counter。 加1
>incr counter
>incrby counter 50. 加50
使用mset和mget完成一次性多个key-value对应关系:
>mset a 10 b 20 c 30
>mget a b c
Push一类命令返回值为list的长度:
>rpush mylist A
>rpush mylist B
>lpush mylist first
>lrange mylist 0 -1
rpush为添加xx元素
Lrange里面的0表示list开头第一个,-1表示list倒数第一个,lrange为查看list元素
>rpush mylist 1 2 3 4 5 “foo bar”
>lrange mylist 0 -1
pop命令:
>del mylist
>rpush mylist a b c.
>rpop mylist 取出mylist最右边的元素
>lrange mylist 0 -1
>lpop mylist
>lrange mylist 0 -1
redis hashes存储:
>hmset user:1000 username antirez birthyear 1977 verified 1
>hget user:1000 username
>hget user:1000 birthyear
>hgetall user:1000
>hmget user:1000 username birthyear no-such-vield
hash加法:
>hincrby user:1000 birthyear 10
sadd命令产生一个无序集合,返回集合元素个数,smembers用于查看集合
>sadd myset 1 2 3
>smembers myset
sismember用于查看集合是否存在以及元素是否存储,匹配成功返回1,失败返回0
zadd是添加有序集合,zrange正序查看,zrevrange是反序查看
>zadd hackers 1940 "Alan Kay"
>zadd hackers 1957 "Sophie Wilson"
>zadd hackers 1953 "Richard Stallman"
>zrange hackers 0 -1
>zrevrange hackers 0 -1
使用withscores参数返回记录值
>zrange hackers 0 -1 withscores
):exists和del
>set mykey hello
>exists mykey
>del mykey
>exists mykey
):type and keys
type查看value的类型,没有则返回none,keys查看key列表
>set mykey x
>type mykey
>keys my*
>del mykey
>keys my*
>type mykey
):randomkey and clear
): rename and renamenx
>rename mylist newlist
):dbsize
返回当前数据库的key总数
):expire。限制key生存时间,单位秒
>set key some-value
>expire key 10
>get key
>get key. 10m后执行时,值已不存在
):限时操作可以在set命令中实现,ttl查询key的剩余生存时间
>set key 100 ex 30. (30秒)
>ttl key
>ttl key
):flushdb:清空当前数据库中的所有键
):flushall:清空所有数据库中的所有键
):config get and config set
config get:用于读取运行redis服务器的配置参数
config set:用于更改运行redis服务器的配置参数
auth:认证密码
>config get requirepass (查看密码)
>config set requirepass test123 (设置密码)
>config get requirepass (报错,没有认证)
>auth test123
>config get requirepass
查询数据类型的最大条目:
>config get *max-*-entries*
config resetstat:重置数据统计报告
):info查询redis的相关信息
reg:
>info keyspace
>info server
>info cpu
):设置密码
grep -n requirepass /etc/redis/redis.conf
sudo vim /etc/redis/redis.conf
将# requirepass foobared 改为. requirepass test123 即可
):重启redis-server与密码验证
sudo service redis-server restart
redis-cli
>info
>auth test123
>info
第二种方式:
redis-cli -a test123
>info
):redis事务处理,exec顺序执行队列中的命令
>multi (进入事务)
>set name a
>set name b
>exec
>get name
):持久化机制
1.快照。默认方式
2.aof
save 300 10 #300秒内如果超过10个key被修改,则快照保存
配置文件中的可配置参数:
appendonly yes //启用aof持久化方式
#appendfsync always //收到写命令就立即写入磁盘,最慢,但是保证了数据的完整持久化
appendfsync everysec。//每秒钟写入磁盘一次,在性能和持久化方面做了很好的折中
#appendfsync no。//完全依赖os,性能最好,持久化没有保证
>help save
>save
=======================
redis系统版
redis 01。
1.介绍
1.1 redis是什么
redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
1.2redis主要特点
支持数据的持久化,可以讲内存中的数据保存在磁盘中,重启的时候自动再次加载进行使用
既支持key-value类型的数据操作,还提供list,set,zset,hash等数据结构的存储
支持数据的备份,采用master-slave模式的主从备份。
性能极高-redis能读的速度是11万次/s,写的速度是8万次/s。
所有操作均为原子性操作
丰富的实用特性,如订阅-发布模式,生产者消费者模式,key过期等常用易用的模式
1.3竞品组件
MemoryCache-kv🌟缓存数据库:单进程多线程模型
Apache Ignite-分布式关系型缓存数据库
SSDB-kv型缓存数据库
2.redis安装与基本操作
windows安装
资源链接入口地址:https://github.com/MicrosoftArchive/redis/releases
下载导航-选择2.8.x版本均可
下载完成解压即可完成
开启服务
cmd进入对应目录后,找到服务命令-redis-server.exe,至少设置maxheap后即可运行,如设置最大可展256M内存,则对应的字节为268435456=256*1024KB*1024B
redis-server.exe --mapheap 268435456
通过配置文件启动服务
修改redis.windows.conf中的maxheap参数值为268435456
redis客户端链接redis服务器
cmd进入对应目录后,找到服务命令redis-cli.exe
直接运行即可,默认链接127.0.0.1 6579端口
或者自己指定ip ,port
redis-cli.exe -h 127.0.0.1 -p 6379
linux安装
资源入口链接-http://download.redis.io/releases/
下载导航-选择2.8.x版本均可
下载地址为:http://download.redis.io/releases/redis-2.8.24.tar.gz
通过浏览器直接打开,或者wget均可
下载完成后,直接解压为源码包,需要编译后方可使用
编译过程与server运行
tar -xzvf redis-2.8.24.tar.gz
cd redis-2.8.24
make
cd src
./redis-server
或者./redis-server ../redis.conf //按指定的参数文件来启动redis-server,参数文件配置等同widows的conf文件
查看端口:lsof -i:6379 or. ll /proc/24482. or. ps aux|grep redis
maxmemory. 为最大内存。 默认是电脑的最大内存
客户端链接server
cd src
./redis-cli
redis不同版本之间的互联:
window的redis-cli链接linux-redis server
bat脚本语言(win):(linux是shell)
auto_startserver.bat:
redis-server.exe redis.windows.conf
auto_startclient.bat:
redis-cli.exe -h 127.0.0.1 -p 6379
3. redis重要说明
3.1 redis架构设计说明
单进程单线程模型的KV数据库
多线程处理可能涉及到锁
多线程处理会涉及到线程切换而消耗CPU
无法发挥多核CPU性能,不过可以通过在单机开多个redis实例来完善
完全基于内存
数据结构简单,对数据操作也简单
使用多路I/O复用模型(网络io事件模型-epoll)
网络IO都是通过socket实现,server在某一个端口持续监听,客户端通过socket(IP+port)与 服务器建立连接
(serversocket.accept),成功建立连接之后,就可以使用socket中封装的InputStream和OutputStream进行IO交互了。
针对每个客户端,Server都会创建一个新线程专门用于处理
默认情况下,网络IO是阻塞模式,即服务器线程在数据到来之前处于阻塞状态,等到数据到达,会自动唤醒服务器线程,着手进行处理。阻塞模式下,一个线程只能处理一个流的IO事件
5种网络IO模型。 (单线程的数据最好是要精简)
阻塞IO,非阻塞IO,IO复用模型,信号驱动IO,异步IO模型
IO复用模型中包括:select模式,poll模式,epoll模式(event poll模式),其中epoll是select和poll模型的升级优化,使得一个线程可以最大限度,最高效的监听和响应更多路客户端的IO请求
3.2 redis持久化重要说明
redis数据存储模式只有两种
cache-only
只做为“缓存”服务,数据均在内存中,不持久化数据,服务停掉则数据全部丢失,且无恢复方法,高速但安全性低
persistence
数据不只是在内存中,还会以配置的持久化方式持久化到磁盘中,保证服务停止后数据还可以恢复
持久化方式选择
RDB:默认
在某个条件番组后触发,一次性快照(snapshot)。将所有数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。
snapshot触发的时机,是有“间隔时间”和“变更次数”共同决定,同时符合2个条件才会触发snapshot,否则“变更次数”会被继续累加到下一个“间隔时间”上。
snapshot过程上启动一个独立的子进程完成,故并不阻塞客户端请求。snapshot首先将数据写入临时文件,当成功结束后,将临时文件重命名为dump.rdb
rdb优缺点说明:
优点:
文件紧凑
形式简单即单rdb文件
由子进程完全独立搞定对主进程无影响
恢复速度快
缺点:
每次保存都是保存一个完整数据集的操作,持续时间可长可短,对丢失数据控制力不佳
若数据量过大,造成CPU和IO压力大,会影响主线程服务性能
Append-only file(AOF)
将“写操作+数据”以格式化指令的方式追加到操作日志文件的尾部,“日志文件”保存了历史所有的操作过程
当server需要数据恢复时,可以直接replay此日志文件,即可还原所有的操作过程。
由于aof操作是发生在后台异步线程执行,可以采用no文件同步(交给操作系统策略同步),每秒钟fsync同步一次,每个写入发生时fsync同步一次,默认为每秒同步一次。
aof也不是绝对无数据丢失的:aof是写入内存cache,由后台线程按照aof策略执行fsync,极端情况下依然会丢失相应的数据
aof优缺点说明:
优点:
数据持久化更及时,效果更好
尾部追加方式,且为后台线程执行,效果很高,亦不影响主线程服务性能
自动进行aof日志重写和替换,达到适时瘦身的效果
日志文件为文本形式,易读易维护易修复
缺点:
aof日志文件体积一般比rdb方式要大
在数据恢复时,aof的恢复速度一般是慢于rdb
4.redis常用命令
redis设置密码
在redis.conf中,修改requirepass参数
requirepass xxxxxx
重新启动redis-server ./redis-server ../redis.conf
客户端带密码连接
./redis-cli -a xxxxxx
客户端先进入后命令验证
./redis-cli
auth xxxxxx
key常用命令:(第11集)
set key value
get key
del key
dump key //返回key对应的序列化后的值
keys pattern //常用的是keys *
exists key
expire key seconds //给指定key设置失效时间
expireat key timestamp //以截止时间为失效时间段(时间戳/s)
ttl key //返回剩余存活时间,-1为永久,-2为没有
randomkey
rename key newkey
renamenx key newkey //当newkey不存在时,将key改为newkey
type key
5.hashmap常用命令
hset map1 k1 v1
hsetnx key field value
hvals key //获取其所有的key值
hexists key field
hget key value
hgetall key
hkeys key
hlen key //取得所有的键值
hmget key field1 [field2]...
hmset key field1 value1 [field2 value2]
6.list常用命令以及生产者消费者模式的实现
lpush
lpushx
lrange key index_start index_stop //获取指定范围的value
rpop key //移除并获取列表中最后一个参数
rpush
rpushx
llen key
lpop key //移除并获取列表中第一个参数
//这里用下面两个参数来实现生产者消费者。
//多开几个redis来模拟生产者消费者的意思,即1个先长时间阻塞住,另外几个来往里面生产
blpop key1 [key2] timeout //移出并获取列表的第一个数,如果没有值取则阻塞timeout秒
brpop key1 [key2] timeout
7.set和zset
set主要存储的是String类型. hash表实现
sadd key member1 [member2]
srem key member1 [member2] //删除
sismember key member //判断key在set里面是否存在
smembers key //返回所有成员
smove A B member
spop key
sunion key1 [key2] //返回指定所有集合的并集
sunionstore C key1 [key2] //并集后存储到C集合
sinter key1 [key2]
scard key //获取集合成员数
sdiffstore C key1 [key2] //差集,存到C
sinterstore C key1 [key2]
zset(SortedSet)有序集合
跟set比多了一个double的分数参数,从小到大排序
zadd key score value
zcard key
zcount key min max //计算有序集合中指定区间分数的成员数
zincrby key increment member //对指定成员的分数加上增量increment
zinterstore C numbkeys key[key...] //交集,C
zlexcount key min max //计算指定字典区间内成员数
(- + 指全部; [:指定特定值)
zrange key start stop //通过索引区间返回有序集合内指定区间内成员
zrangebylex key min max //通过字典区间返回成员
zrank key member //返回指定成员的索引
zrem
zscore key member //返回有序集中成员的分数值
...
8.使用HyperLogLog结构做高效基数统计
基数这里就是去重的意思
1.硬统计-hashset (1000万个)
2.bitset:位图:-bloomfilter
3.概率统计基数:极小的空间,通过概率方式求出巨大数量的一个基数结果,reg:几十亿。但是不够精准。
在1%标准误差范围内,可以用该结构。
优点:输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的,且很小的。每个HyperLogLog键只需要12KB内存,即可计算近2^64个不同元素的基数。且其所占存储空间并不是线性增长的。
只计算基数,并不存储数据本身,故不能查看元素。
pfadd hyper1 v1 v2 v3
pfcount hyper1 (reg:统计网站的UV信息等)
redis事务
可以理解为批量执行单条命令。而且中间不会被其它事物打断。
multi
set k1 v1
set k2 v2
set k2 v3
exec (上面命令批量执行)
multi
set k1 v1
discard //取消事务,取消set k1 v1 这个块的命令
redis连接服务器操作
echo "123"
ping 127.0.0.1 //PONG代表OK
quit
select index //切换到指定的数据库,默认有16个数据库,默认选择索引为0的数据库
bgrewriteaof
...
dbsize
flushall 清空所有数据库key
flushdb 清空当前数据库key
lastsave
monitor 调试时用,监控
save
shudown
slaveof host port 将当前服务器变为指定服务器的从属服务器
slaveof 127.0.0.1 6379 -a tianliangedu
java操作redis
·java操作redis的第三方库jedis
com.utils
public class RedisUtil{
main(){
//连接本地的Redis服务
Jedis jedis = new Jedis("localhost",6379);
jedis.auth("tianliangedu");
//查看服务是否运行
sout("服务正在运行:" + jedis.ping());
//添加kv
jedis.set("jedis_k1","jedis_v1");
sout(jedis.get("jedis_k1"));
//添加集合
jedis.hset("set1","set_k1","set_v1");
sout(jedis.hget("set1","set_k1"));
}
}
6.redis使用场景
·加速数据库访问
·缓存一些静态数据 (不需要去mysql数据库里查)
·缓存一些不经常变化数据
·缓存一些高耗时计算的数据
·缓存一些预计算的数据
·充当中间件,做系统模块或子系统之间的解耦使用。(可以不用http通信)