redis

简介

什么是redis

redis是完全开源免费的,遵守bsd协议,是一个高性能nosql的key-value数据库,redis是一个开源的使用ANSI c语言编写,支持网络,可基于内存亦可持久化的日志型,key-value数据库,并提供多种语言的api

bsd开原协议是一个给与使用者很大自由的协议.开源自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布.bsd代码鼓励代码共享,但需要尊重代码作者的著作权

bsd由于使用者修改和重新发布代码,也允许使用火灾bsd代码上开发商业软件发布和销售,因此是对商业集成很友好的协议

Nosql

nosql,泛指非关系型数据库,nosql即not-only sql,它可以作为关系型数据库的良好补充.随着互联网web2.0网站的兴起,菲关系型的数据库现在成了一个及其热门的新领域,非关系型数据库的发展十分迅速

从传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的sns类型的web2.0船动态网页已经显得力不从心,暴露了很多难以克服的问题

  • 对数据库高并发读写的需求
  • 对海量数据的高效率存储和访问需求
  • 对数据库的高可扩展性的需求

nosql区别

键值存储数据库

这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据.key/value模型对于it系统来说优势在于简单易部署.但是如果dba支队部分值进行查询或者更新的时候key/value就显得效率低下了

相关产品:redis,voldemort,berkeley db

典型应用:内容缓存,主要用以处理大量数据的高访问负载

数据模型:一系列键值对

优势:快速查询

劣势:存储的数据缺少结构化

列存储数据库

这部分数据库通常是用来应对分布式存储的海量数据.键仍然存在,但是他们的特点是指向了多个列.这些列是由加速来安排的.

相关产品:cassandra,hbase,riak

典型应用:分布式的文件系统

数据模型:以列簇式存储,将同一列数据存在一起

优势查找速度很快,可扩展性强,可任意进行分布式服扩展

劣势:功能相对局限

文档型数据库

它通第一种键值存储相类似.该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如json.文档型数据库可以看做是键值数据库的升级版,允许之间嵌套键值.而且文档型数据库比键值数据库的查询效率更高

相关产品:mongdb

典型应用:web应用

数据模型:一系列键值对

优势:数据结构要求不严格

劣势查询性能不高,缺乏统一的查询语法

图形数据库

图形结构的数据库同其他行列以及刚性结构的sql数据库不同,它是用灵活的图形模,并且能够扩展到多个服务器上.nosql数据库没有标准的查询语言(sql),因此进行数据库查询需要制定数据模型.许多nosql数据库都有rest式的数据接口或者查询api

相关数据库:neo4j,infogrid,infinite graph

典型应用:社交网络

数据模型:图结构

优势:利用图结构相关算法

劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案

总结

因此,nosql数据库在以下的情况下比较适用:

1,数据模型比较简单

2,需要灵活性更强的it系统

3对数据库查询性能要求较高

4不需要高度的数据一致性

5对于给定的key没比较容易映射复杂的环境

nosql数据库的产生就是为了解决大规模数据集合多重数据类带来的挑战,尤其是大数据应用难题(高并发)

redis描述

优点

  • 性能高:理论上,redis读的速度支持110000次每秒,写的速度81000次每秒
  • 丰富的数据类型redis支持的类型string,hash,list及redered set数据类型操作
  • 原子性Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行.单个操作是原子性的.多个操作也支持失误,即原子性,通过multi和exec指令包含起来
  • 丰富的特性:redis还支持publish/subscribe,通知,key过期等等特性
  • 高速读写redis使用自己实现分离器,代码量很短,没有lock(mysql)因此效率非常高

缺点

持久化:。redis直接将数据存到内存中,要将数据保存到磁盘上,redis可以使用俩种方式实现持久化的过程。定时快照:每隔一段时间将整个数据库写道磁盘上,每次均写的是全部数据,代价非常高。第二种方式基于语句追加(aof):之追踪变化的数据,同时所有的操作均重新执行一遍,回复速度慢

耗内存:占用内存过高

redis应用场景

企业级开发中:可以做数据库,缓存,热点数据(经常会被查询,但是不经常修改的或者删除的数据)

和消息中间件等大部分功能

redis的常用的场景如下

  • 缓存
  • 排行榜:如京东的阅读销量榜单,上面按时间上线
  • 计数器
  • 分布式会话
  • 分布式锁
  • 社交网络
  • 最新列表
  • 消息系统

启动redis

在进入redis客户端

cd /usr/local/redis

执行命令

./bin/redis-cli

启动Redis客户端命令语法

cli-cli -h ip地址 -p 端口 //默认ip本机端口6379

ctrl+c退出

查看redis运行情况

ps -ef| grep -i redis

redis命令

redis命令用于在redis服务上执行操作。

redis支持物种数据类型String(字符串),hash(哈希),list(列表),set(集合),zset(有序集合)

常用命令key管理

keys * :返回满足的所有键值,可以模糊匹配 比如keys abc* 代表abc开头的key
exists key:是否存在指定的key,存在返回1,不存在返回0
expire key second:设置摸个key的过期时间,时间为秒
del key:删除某个key
ttl key:查看剩余时间,当key不存在时,返回 -2;存在但没有设置生存时间时,返回-1,否则以秒为单位,返回key的剩余生存时间
persist key:取消过去时间
PEXPIRE key milliseconds 修改key 
select :选择数据库 数据库为0-15(默认16个数据库)
设计成多个数据库实际上是为了数据库的安全和备份
move key db index:将当前数据中的key转移到其他数据库
randomkey:随机返回一个key
rename key key2 重命名key
echo:打印命令
dbsize:查看数据库的key数量
info:查看数据库信息
config get * 试试转存储收到的请求,返回相关的配置
flushdb:清空当前数据库
flushall:清空所有数据库
type key 返回存储值的类型

有效期应用场景

显示的优惠活动

网站数据缓存

手机验证码

限制网站访客的访问频率(比如一分钟最多60次)---对ip进行计数(技术key的生存时间为1秒)

命名规范

单个key允许存入512大小

key不要太长,尽量不要超过1024字节,这不仅消耗内存,而且会降低查找的效率

可以不要太短,太短的话可读性会降低,在一个项目中,key最好用同意的命名模式

key名称区分大小写

redis数据类型

String类型

简介

string类型是redis最基本的数据类型,一个键最大能存储512mb

string类型数据结构是最简单的key-value类型,value不仅是string也可以是数字,是包含多种类型的特殊类型,string类型是二进制安全的,意思redisstring可以包含任何数据

比如序列化的对象进行存储,比如一张图片进行二次存储,比如一个简单的的字符串数值等等

命令

设置:
set (key) (value) //赋值 如果多次设置name就会覆盖
setnx (key) (value) //如果key不存在,则设置值,返回1.如果key存在不设置值返回0,解决分布式锁的方案之一,只有key不存在时设置key的值
setex (key) (time) (value) //设置key的值与过期时间
setrange (key) (偏移量) (value) //覆盖给定key的存储字符串,覆盖的位置从偏移量开始

取值
get (key) 获取指定key的值 ,如果key不存在返回nil,如果key存储的不是字符串类型,返回一个错误
getrange (key) (start) (end):用于截取存储在指定key中字符串子串,字符串的截取范围由start和end俩个偏移决定,从第start到
getset (key)(newvalue)命令用于设置指定的key的值,返回key的旧值,当key不存在时,返回nil
strlen key:返回key锁存储的字符串长度

删除
del (key) 删除指定的key,如果存在,返回值类型的个数

mset (key1) (value1) (key2) (value2) ... //批量赋值
mget (key1) (key2) ... //批量取值

自增/自减
incr (key) 将key中存储的值自增1,如果key不存在,那么key的值就会被初始化为0,然后执行自增操作,如果目标值不是整数,会报错
decr (key)将key中的值减1,将key中存储的值自增1,如果key不存在,那么key的值就会被初始化为0,然后执行自减操作
incrby (key) 将key存储的数字加上指定的增量值
decr (key)将key存储的增量减去指定的增量值

append (key) (value) append命令用于为指定的key追加至末尾,如果不存在,为其赋值,返回长度

应用场景

string通常用于保存单个字符串或json字符串数据

string是二进制安全的,所以你完全开源把一个图片文件的内容作为字符串来存储

计数器(常规key-value缓存应用,常规计数,微博数,粉丝数)

incr等命令本身就具有原子性,所以我们完全可以利用redis的incr等指令来实现原子计数的效果,.假如,在某种场景下有三个客户端读取了key的值,然后对其进行了+1的操作,那么key的值一定是5(多线程高并发友好)

不少网站都利用redis这个特性来实现业务上的统计需求

hash类型

简介

hash类型是string类型的field和value映射表,或者说是一个string的集合.hash特别适合用于存储对象,相比较而言,将一个对象类型存储在hash类型要存储在string类型里占用更少的空间,并对整个对象的存取可以看成具有key和value的map容器,该类型非常适合存储值对象的信息,

如用户名,密码年龄,改类型的数据仅占用很少的磁盘空间(相比于json)

redis每个hash可以存储2的32此房-1键值对(40多亿)

hash命令

赋值
hset (key) (filed) (value) :为指定的key设定fild/value
hmset (key) (field) (value) [field1,value1]... :同事多个field-value(域-值对设置到哈希表key中)

取值语法
hget (key) field :获取存储在hash中的值
hmget (key) field[field1]:获取key所有给定字段的值
hgetall (key) :返回hash表中所有字段的域和值
hkeys (key) :获取哈希表中的字段(域)

删除语法
hdel (key) (field) (field) :删除对于key中的field域和其中的数据,删除成功返回删除的数量,没有删除返回0
del (key) :del命令能删除所有类型的key

其他语法
hsetnx (key) (field) (value) :只有在字段field不存在时候,设置hash表字段的值,已存在返回0,不存在返回1 
hincrby (key) (field) (increment) :为哈希key中的指定字段的浮点数值增加上增量increment(同样只能是整数)

应用场景

hash是最接近关系数据库结构的数据类型,可以将数据库一条记录或程序中程序一个对象转换成hashmap存放在redis中.

用户id为查找的key,存储的value用户对象包含姓名,年龄生日等信息.

redis提供的hash很好的解决了这个问题,redis的hash实际是内部存储的value为一个hashmap,并提供了直接存取这map成员类型的接口

list类型

简介

list类型是一个链表结构的集合,其主要功能有push,pop,获取元素等.更详细的说,list类型是一个爽端链表的节后,我们可以通过相关的操作进行集合的头部或者尾部添加和删除元素,list的设计非常简单精巧,可以作为栈,也可以作为队列

按照插入的顺序排序,可以添加一个元素到列表的头部(左边)或者尾部(右边)一个列表最多可以包含2的32次方-1个元素(每个列表超过40亿个元素)

类似java中的linkedList

常用命令

赋值
lpush (key) (value) (value2) ... :将一个或多个插入到列头部
rpush (key) (value) (value2) ... :在列表中添加一个或多个值(从右侧添加)
lpushx key value:将一个值插入到已存在的列表头部,如果列表不在,操作无效
rpushx key value :一个值插入存在的列表尾部(最右边).如果列表不在操作无效.

取值
llen (key) :获取列表长度
lindex (key) (index) :通过索引获取列表中的元素
lrange (key) (start) (stop) :获取列表指定范围内的元素 可以指定stop为-1代表倒数第二个

删除
lpop (key) :移除并获取列表的第一个元素,返回值为移除的元素(从左侧删除)
rpop (key) :移除列表最后的一个元素,返回值为移除的元素(从右侧删除)
blpop (key) (time) :移除并获取列表的第一个元素,如果列表没有元素会阻塞列表知道等待超时或发现可弹出元素为止
brpop (key) (time) :移除并获取列表的最后一个元素,如果列表没有元素会阻塞列表知道等待超时或发现可弹出元素为止
ltrim (key) (start) (stop)

修改
lset (key) (index) (value):通过索引设置列表元素的值
linsert (key) before (index) (value):在索引之前插入数据
linsert (key) after (index) (value):在索引之后插入数据

高级
rpoplpush (key1) (key2) : 移除列表的最后一个元素,并将该元素添加到另一个列表并返回

场景

项目常应用于

  • 对数据大量的集合数据删减
  • 任务队列

对数据亮大的集合数据删减

列表数据显示,关注列表,粉丝列表,留言评价等..分页新闻热点(top5)等,利用lrange还可以很方便的实现分页的功能,在博客系统中,每篇博文的评论也可以存入一个单独的list中

任务队列

list通常用来实现一个消息队列,而却可以确保先后顺序,不必像mysql那样还需要通过order by 来进行排序

任务队列介绍(生产模式和消费模式)

​ 在处理web客户端发送的命令请求时,默写操作的执行时间可能回避我们预期的更长一些,通过将执行任务的相关信息放入队列里面,并在之后队列进行处理,用户可以推迟执行那些需要一段时间才能完成的操作,这种将工作交给任务处理器来执行的做法被称为任务队列(task queue)\

移除队列的最后一个元素,并将该元素添加到另一个列表并返回

案例

  • 比如获取最新的5条首页新闻,获取最新的评论,获取最后登录的10个用户,获取最近7天的活跃用户数等作为队列来使用
  • 用户系统登录注册短信实名认证等,订单系统的下单流程等

set类型

简介

redis的set是string类型的无序集合.集合成员是唯一的,这就意味着集合中不能出现重复的数据.redis中集合是通过哈希表实现的,set是通过hashtable实现的

集合中最大的成员数为2的32次方-1 (可以存储40多亿个成员)

类似java中的hashtable

命令

赋值
sadd (key) :向集合中添加一个或多个成员

取值
scard (key) : 获取集合的成员数
smembers (key):返回集合中所有的成员
sismember (key) (member):判断member元素是否是集合key的成员是的返回1,否则返回0(开发中:判断是否存在判断)
srandmember (key) [count]:返回集合中一个或多个随机数 ,count不填返回1个,填的话返回count个

删除
srem (key) (member) [member] ... :删除集合中的一个或多个成员
spop (key) [count] 移除并返回集合中的一个随机元素
smove (key1) (key2) (member):将member元素从key1集合移动到key2集合,移动了返回1,没移动返回0

差集语法
sdiff (key) [key2] :返回给定所有集合的差集,不填写第二个参数就返回全部结果(左侧)
sdiffstore (key1) (key2) [key3]...  :返回给定所有集合的差集并存储在key1当中
交集语法
sinter (key1) (key2):返回给定所有集合的交集(共有数据)
sinterstore  (key1) (key2) [key3] ... :返回指定集合的交集并存储在key1当中
并集语法
sunion (key) [key2] ... :返回所有集合的交集(全部数据)
sunionstore (key1) (key2) [key3] ... :所有给定集合的并集存储在key1中

场景

对俩个集合键的数据记性交集差集运算

利用集合操作,可以不同兴趣圈子的交集,已非常方便的实现如共同关注,共同爱好,二度爱好等功能对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存储到一个新的集合当中

利用唯一性,可以统计访问网站的所有独立ip,存取当前或某天的活跃用户列表

zset

有序集合(sort ed set)

简介

redis有序集合和集合一样也是string类型元素的集合,且不允许重复的成员

不同的是每一个元素都会关联一个double类型的分数.redus正是通过分数来为集合中的成员进行从小到大的排序

有序集合的成员是唯一的,但分数却可以重复

集合是通过hash表实现的.集合中最大的成员数为2的32次方-1(四十多亿)rediszset是有序,且不重复

命令

赋值语法
zadd (key) (score) (member) [score member]:向一个有序集合添加一个或多个成员,或者在更新已存在的成员分数,score可以为小数

取值
zcard (key) :获取有序集合的成员数
zrange (key) (start) (stop):通过索引区间返回有序集合指定区间内的成员(低到高) 可以用0 -1输出全部
zrevrange (key) (start) (stop)通过索引区间返回有序集合指定区间内的成员(高到低) 可以用0 -1输出全部
zcount (key) (min) (max) :计算在有序集合中指定范围的数量
zrank (key) (member):返回有序集合中指定成员的索引
zrangebyscore (key) (max) (min) :返回有序集合中指定分数区间的成员,分数从高到低排列

删除
del (key) :移除集合,移除了返回1,没有返回0
zrem (key) (member) [member]:移除有序集合中的一个或多个成员,删除了返回1,没删除返回0
zremrangebyrank (key) (start) (stop):移除有序集合中给定的排名区间的所有成员(第一是0)(低到高排序)
zremrangebyscore key min max:移除有序集合中给定的分数区间的所有成员

应用场景

常应用于排行榜

销量排名

Last modification:November 17, 2023
如果觉得我的文章对你有用,请随意赞赏