缓解了io压力
Web1.0的时代,数据访问量很有限,用一夫当关的高性能的单点服务器可以解决大部分问题。
随着Web2.0的时代的到来,用户访问量大幅度提升,同时产生了大量的用户数据。加上后来的智能移动设备的普及,所有的互联网平台都面临了巨大的性能挑战。
NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库。
NoSQL 不依赖业务逻辑方式存储,而以简单的key-value模式存储。因此大大的增加了数据库的扩展能力。
安装Redis6网上有很多的教程 可以找适合的进行安装 这里是用yum进行安装的
在CentOS和Red Hat系统中,首先添加EPEL仓库,然后更新yum源:
sudo yum install epel-release
sudo yum update
然后安装Redis数据库:
sudo yum -y install redis
安装好后启动Redis服务即可:
sudo systemctl start redis
这里同样可以使用redis-cli进入Redis命令行模式操作。
另外,为了可以使Redis能被远程连接,需要修改配置文件,路径为
/etc/redis.conf
我们进入这个文件
vi /etc/redis.conf
需要修改的地方:
首先,注释这一行:
#bind 127.0.0.1
另外,推荐给Redis设置密码,取消注释这一行:
#requirepass foobared
foobared即当前密码,可以自行修改为
requirepass 密码 设置密码很重要 如果你没有密码小心你的服务器被绿林好汉们用来挖矿
我们需要Redis在后台启动
我们需要把配置文件里面的
daemonize no改成yes
然后重启Redis服务,使用的命令如下:
sudo systemctl restart redis
systemctl start redis.service #启动redis服务器
systemctl stop redis.service #停止redis服务器
systemctl restart redis.service #重新启动redis服务器
systemctl status redis.service #获取redis服务器的运行状态
systemctl enable redis.service #开机启动redis服务器
systemctl disable redis.service #开机禁用redis服务器
keys * # 查看当前库所有key (匹配:keys *1)
exists key # 判断某个key是否存在
type key # 查看你的key是什么类型
del key # 删除指定的key数据
unlink key # 根据value选择非阻塞删除
仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作。
expire key 10 # 10秒钟:为给定的key设置过期时间
ttl key # 查看还有多少秒过期,-1表示永不过期,-2表示已过期
select # 命令切换数据库
dbsize # 查看当前数据库的key的数量
flushdb # 清空当前库
flushall # 通杀全部库
String是Redis最基本的类型,一个key对应一个value。
String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象。
String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M
当String的空间不够用的时候他会把String的空间给增加一倍 如果超过1M的话一次就增加1M
set key value # 如果不存在则创建一个key value,如果key已存在修改value的值
get key # 获取key的value值
strlen key # 获取key的长度
setnx key value # 创建一个key value,如果key已存在报错
incr key # 将key中储存的值+1,value必须为数字类型
decr key # 将key中储存的值-1,value必须为数字类型
incr key 步长 # 将key中储存的值+步长,value必须为数字类型
decr key 步长 # 将key中储存的值-步长,value必须为数字类型
mset key value key value # 创建多个key value
mget key value key value # 获取多个key的value值
msetnx key value key vale # 创建多个key value值,key不存在情况下
getrange key 3 4 # 获取一个key的第三个字符到第四个字符,包前包后
setrange key 3 value # 在第三个字符后面插入一个value
setex key 过期时间 value # 规定一个key过期时间
getset key value # 查看一个key的value,但随后被替换为新的value
lpush key value1 value2 valu3 # 在左边插入值,结果是 value3 value2 value1
rpush key value1 value2 valu3 # 在右边插入值,结果是 value1 value2 value3
rpoplpush key1 key2 # 从key1的右边吐出一个值,就像迭代器一样,每执行一次吐出一个值加到key2后面
lrange key value start stop # 取出这个key的start stop的值,0 -1是取出全部
lindex key index # 根据index取出value的值
llen key # 获取key的长度
linsert key before value newvalue # 在本来的value值后面插入一个值
lrem key n value # 从左边删除n个value
lset key index value # 将key下标为index的value替换为新的value
sadd key value value # 创建一个新的集合
smembers key # 取出该集合所有的值
sismember key value # 判断该集合是否含有value值 有1 无0
scard key # 返回该集合的元素个数
srem key value1 value2 # 删除集合中的value元素
spop key # 随机吐出集合的一个值,吐出就删除了
srandmember key n # 随机从集合中取出n个值,不删除
smove key1 key2 value # 从key1中取出value添加到key2中
sinter key1 key2 # 返回两个集合交集的元素,2个集合都有的值
sunion key1 key2 # 返回两个集合并集的元素,2个集合全部的值
sdiff key1 key2 # 返回两个集合差集的元素,key1中没有key2的值
hset key field value # 添加一个哈希集合,添加一个值 hset user id 1
hget key field # 获取key中field的value值
hmset key field value1 field value2 # 添加一个哈希结合,添加多个值 hmset user id 1 name zhangsan
hexists key field # 查看哈希表key中,field是否存在
hkeys key # 列出该hash集合所有的value
hincrby key field increment # 为哈希表key中field的value值加步长
hsetnx key field value # 在哈希表key中添加一列firld-value
Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。
不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 。
zadd key 评分 value 评分 value # 创建一个有序集合,根据评分选择先后
zrange key start end withscores # 返回下标为几到几的,withscores显示评分
zrangebyscore key 评分~评分 [withscores] # 返回评分几到几,withscores显示评分
zrevrangebyscore key 评分~评分 [withscores] # 返回key中频分几到几的值,withscores显示评分,从大到小排列
zincrby key 步长 value # 为key中的value评分加步长
zrem key value # 删除指定的值
zcount key min max # 评分几到几的个数
zrank key value # 返回该值在集合中的排名,从0开始
配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bit
大小写不敏感
类似jsp中的include,多实例的情况可以把公用的配置文件提取出来
默认情况bind=127.0.0.1只能接受本机的访问请求
不写的情况下,无限制接受任何ip地址的访问
生产环境肯定要写你应用服务器的地址;服务器是需要远程访问的,所以需要将其注释掉
如果开启了protected-mode,那么在没有设定bind ip且没有设密码的情况下,Redis只允许接受本机的响应
设置tcp的backlog,backlog其实是一个连接队列,backlog队列总和=未完成三次握手队列 + 已经完成三次握手队列。
在高并发环境下你需要一个高backlog值来避免慢客户端连接问题。
是否为后台进程,设置为yes
守护进程,后台启动
指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为notice
四个级别根据使用阶段来选择,生产环境选择notice 或者warning
设定库的数量 默认16,默认数据库为0,可以使用SELECT 命令在连接上指定数据库id
设置redis同时可以与多少个客户端进行连接
默认情况下为10000个客户端。
如果达到了此限制,redis则会拒绝新的连接请求,并且向这些连接请求方发出“max number of clients reached”以作回应。
建议必须设置,否则,将内存占满,造成服务器宕机
设置redis可以使用的内存量。一旦到达内存使用上限,redis将会试图移除内部数据,移除规则可以通过maxmemory-policy来指定。
如果redis无法根据移除规则来移除内存中的数据,或者设置了“不允许移除”,那么redis则会针对那些需要申请内存的指令返回错误信息,比如SET、LPUSH等。
但是对于无内存申请的指令,仍然会正常响应,比如GET等。如果你的redis是主redis(说明你的redis有从redis),那么在设置内存使用上限时,需要在系统中留出一些内存空间给同步队列缓存,只有在你设置的是“不移除”的情况下,才不用考虑这个因素。
volatile-lru:使用LRU算法移除key,只对设置了过期时间的键;(最近最少使用)
allkeys-lru:在所有集合key中,使用LRU算法移除key
volatile-random:在过期集合中移除随机的key,只对设置了过期时间的键
allkeys-random:在所有集合key中,移除随机的key
volatile-ttl:移除那些TTL值最小的key,即那些最近要过期的key
noeviction:不进行移除。针对写操作,只是返回错误信息
设置样本数量,LRU算法和最小TTL算法都并非是精确的算法,而是估算值,所以你可以设置样本的大小,redis默认会检查这么多个key并选择其中LRU的那个。
一般设置3到7的数字,数值越小样本越不准确,但性能消耗越小。
Redis 客户端可以订阅任意数量的
1、 打开一个客户端订阅channel1
SUBSCRIBE channel1
2、打开另一个客户端,给channel1发布消息hello
publish channel1 hello
返回的1是订阅者数量
3、打开第一个客户端可以看到发送的消息
注:发布的消息没有持久化,如果在订阅的客户端收不到hello,只能收到订阅后发布的消息
Setbit key offset value # 创建一个Bitmaps中某个偏移量的值 0 或 1
每个独立用户是否访问过网站存放在Bitmaps中, 将访问的用户记做1, 没有访问的用户记做0, 用偏移量作为用户的id。
设置键的第offset个位的值(从0算起)
假设现在有20个用户,userid=1 6 11 15 19的用户对网站进行了访问
那么当前Bitmaps初始化结果如图
Getbit key offset # 获取bitmaps中的某个偏移量
获取id为8的用户是否在某天访问过,返回0说明没有访问过:
Bitcount key # 获取这个key中为1的数量
Bitcount key start end # 计算start8到end8中1的个数
Bitop and(or/not/xor) destkey key # bitop是一个复合操作, 它可以做多个Bitmaps的and(交集)、 or、(并集) 、 not(非) 、 xor(异或) 操作并将结果保存在destkey中。
演示案例:
2020-11-04 日访问网站的userid=1,2,5,9。
setbit unique:users:20201104 1 1
setbit unique:users:20201104 2 1
setbit unique:users:20201104 5 1
setbit unique:users:20201104 9 1
2020-11-03 日访问网站的userid=0,1,4,9。
setbit unique:users:20201103 0 1
setbit unique:users:20201103 1 1
setbit unique:users:20201103 4 1
setbit unique:users:20201103 9 1
计算出两天都访问过网站的用户数量
bitop and unique:users:and:20201104_03 unique:users:20201103 unique:users:20201104
Bitop 并集 暂时存储的集合 20201103号 20201104号
用户多的时候用bitmaps 用户少的时候使用key-value
用于记录不重复的数据,比如说在这个类型中的一个key中存储了java,再存java就失败了
pfadd key 值1 值2 # 创建一个set差不多的数据类型
pfcount key [key…] # 统计1个或多个key中不重复的数据
对地理位置的操作
geoadd key 经度 纬度 名称 # 添加一个或多个地理位置坐标
两极无法直接添加,一般会下载城市数据,直接通过 Java 程序一次性导入。
有效的经度从 -180 度到 180 度。有效的纬度从 -85.05112878 度到 85.05112878 度。
当坐标位置超出指定范围时,该命令将会返回一个错误。
已经添加的数据,是无法再次往里面添加的。
geopos key 城市名 # 返回地理位置的经度,纬度
geodist key 地理位置 地理位置 [m|km|ft|mi] # 获取2个位置之间的直线距离
单位:
m 表示单位为米[默认值]。
km 表示单位为千米。
mi 表示单位为英里。
ft 表示单位为英尺。
如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位
georadius key 经度 纬度 距离 单位 # 找出经度纬度半径距离画圆之内的城市