windows系统环境
目录
Redis入门
问题现象:
罪魁祸首---关系型数据库
解决思路
Nosql
常见的Nosql数据库:
解决方案(电商场景):
Redis简介
Redis的应用
Redis的下载与安装
Redis的下载
启动 Redis(双击-server后):
客户端连接:
Redis的基本操作
命令行模式工具使用思考
信息添加
信息查询
清除屏幕信息
帮助
编辑
退出客户端命令
数据存储类型介绍(五种)
业务数据的特殊性
作为缓存使用
附加功能
Redis数据类型(5种常用)
redis数据存储格式
String数据类型的基本操作
String数据类型的拓展操作
解决方案
String 作为数值操作
业务场景
string类型数据操作的注意事项
业务场景
Key的设置约定
Hash
Hash类型
存储的困惑
Hash类型数据的基本操作
Hash类型数据扩展操作
Hash类型数据操作的注意事项
Hash类型应用场景
业务场景
业务分析
解决方案
业务场景
解决方案
list类型
list类型数据基本操作
list类型数据扩展操作
业务场景
解决方案
Tips6:
list类型数据操作注意事项
业务场景
解决方案
Tips:
Set
set类型
set类型数据的基本操作
set类型数据的扩展操作
业务场景
业务分析
解决方案
编辑
Tips8:
set类型数据的扩展操作‘
业务场景
解决方案
解决方案
Tips9:
set类型数据操作的注意事项
set类型应用场景
业务场景1
解决方案
校验工作:redis是提供基础数据还是校验结果?
Tips:
业务场景2
解决方案
Tips11:
业务场景3
解决方案
Tips12:
sorted_set
sorted_set类型
sorted_set类型数据的基本操作
sorted_set扩展操作
业务场景1
业务分析
解决方案
Tips13:
sorted_set类型数据操作的注意事项
业务场景2
解决方案
Tips14:
业务场景3
解决方案
数据类型实战案例
业务场景1
解决方案
解决方案改良
Tips16:
业务场景2
解决方案
Tips17:
Redis通用命令
key特征
key应该设计哪些操作
key基本操作
key的扩展操作(时效性控制)
key的扩展操作(查询模式)
key其他操作
数据库通用指令
key的重复问题
解决方案
db基本操作
Jedis
Jedis简介
编程语言与redis
HelloWorld(Jedis版)
准备工作
客户端连接redis
Jedis读写redis数据
案例:服务调用次数控制
案例:需求分析
Jedis简易工具类开发
基于连接池获取
可视化客户端
Redis Desktop Manager
[数据库是保存在磁盘上的,磁盘的IO性能(也就是读写磁盘的性能较低),
CPU的数据交换和Cache进行交换,Cache和内存进行交换,而内存又和硬盘进行数据交换。
所以,这样一层一层的访问,性能可不就低了,当数据量访问大的时候,就容易崩]
[关系是相互之间交叉,所以可扩展性差]
其实就是Nosql
Nosql:即 Not-Only SQL(泛指非关系型型的数据库,不是具体的某一个),作为关系型数据库的补充。(定位)
作用:应对基于海量用户和海量数据前提下(高并发)的数据处理问题。
特征(了解,都是相对来说的):
概念:Redis(REmote DIctionary Server) 是用C语言开发的一个开源的高性能的键值对(key-value)数据库。内存级数据库。
特征:
5.持久化支持。可以进行数据灾难的恢复。
Linux版(适用于企业级开发)
Windows版(适合零基础学习)
下载3.2.100版本,在这个版本下面下载 .zip:
绿色软件,解压即用。
解压后,根据类型排序,可找到:
从上往下,分别的作用:
作性能测试-> 用作持久化 -> redis可以进行操作 ->启动redis的可执行文件,提供功能(相当于mysql启动了一个服务器一样)
其他:
有port:对应的redis对外提供的端口号:6379
ID地址:本机 localhost/127.0.0.1
PID :每启动一个Redis服务,相当于启动了一个Redis对应的对象,一个对象就是一个实例。这个PID就相当于是这个实例的ID。
下面的就是Redis的执行日志。
可以双击-cli直接启动,也可以在CMD中进入到这个文件夹下,执行redis-cli命令即可;
2.运营平台监控到的突发高频访问数据
3. 高频、复杂的统计数据
系统功能优化或升级
set key value
get key
del key
mset key1 value1 key2 value2 …
mget key1 value1 key2 value2 …
strlen key
append key value
我们实际开发中,不可能让一张表在无限增长,通常会分成不同的几张表,数据库也可以分成几个数据库。Oracle数据库中有序列sequence的概念,那么Mysql是如何解决Id重复的呢?
incr key /*+1*/
incrby key increment /*+increment*/
incrbyfloat key increment /*+小数,eg : 1.5*/
decr key /*-1*/
decrby key increment /*-increment*/
9223372036854…(Java中long类型数据最大值,Long.MAX_VALUE)
Tips1:
投票,4小时内只能投一次
setex key seconds value
psetex key milliseconds value
Tips2:
(nil)等同于null
512MB
微博粉丝数和微博数
解决方案
存储一条数据 set user:id:00789:fans 12213122
Tips:
对象类数据的存储如果具有较繁琐的更新要求操作会显得笨重
hash存储结构优化:
hset key field value
hget key field
hgetall key
hdel key field1 [field2] …
注意:使用hmget获取多个value,的时候,不显示field的值。其他方式获取会显示。
hmset key field1 value1 field2 value2 …
hmget key field1 field2 …
hlen key
hexists key field
hkeys key ---->所有field的值
hvals key ----->所有value的值
hincrby key field incrment
hincrbyfloat key field increment
电商网站购物车的设计与实现
当前的设计是否加速了购物车的呈现
当前仅仅是将数据存储到了redis中,并没有起到加速的作用,商品信息还需要二次查询数据库
命名格式:商品ID:nums
保存数据:数值
命名格式:商品id:info
保存数据:json
hsetnx key field value
Tips:
双11活动日,销售手机充值卡的商家对移动、联通、电信的30元、50元、100元商品推出抢购活动,每种商品抢购上线1000张
哈希不支持自减,可以用负值代替。
Tips:
redis应用于抢购、限购类、限量发放优惠券、激活码等业务的数据存储设计。
hash存储对象 与 string存储对象(json)
hash :由于用field将属性隔离开,所以各个属性间不受干扰,适用于更新操作。
string:讲究整体性,一次性操作。读为主。
左进右查,右进左查。
意思就是:可以看作是一个栈,先进的先入,最后再从左往右赋值索引,这样会好理解一点。
-1代表从右数第一个。
list的阻塞式获取
微信朋友圈点赞,要求按照点赞顺序显示点赞好友信息
如果取消点赞,移除对应好友信息
-----------------------------------------------------------
也可以删除多个相同的value
twitter、新浪微博、腾讯微博中个人用户的关注列表需要按照用户的关注顺序进行展示,粉丝列表需要将最近关注的粉丝列在前面。
新闻、资讯类网站如何将最新的新闻或资讯按照发生的时间顺序展示?
企业运营过程中,系统将产生出大量的运营数据,如何保障多台服务器操作日志的统一顺序输出?
也就是只用field部分用来存储value,原本的value都设置为nil。
hash中存储时没有顺序。
每位用户首次使用今日头条时会设置3项爱好的内容,但是后期为了增加用户的活跃度,兴趣点,必须让用户对其他信息类逐渐产生兴趣,增加客户留存度,提高用户黏性,进而使APP的利益最大化。如何实现?
脉脉为了促进用户间的交流,保障业务成单率的提升,需要让每位用户拥有大量的好友,事实上职场新人不具有更多的职场好友,如何快速为用户积累更多的好友?
新浪微博为了增加用户热度,提高用户留存性,需要微博用户再关注更多的人,以此获得更多的信息或热门话题,如何提高用户关注他人的总量?
QQ新用户入网年龄越来越低,这些用户的朋友圈交际圈很小,往往集中在一个学校或者班级中,如何帮助用户快速积累好友,给用户带来更多的活跃度?
微信公众号使微信信息流通的渠道之一,增加用户关注的公众号成为提高用户活跃度的一种方式,如何帮助用户积累更多的公众号?
美团外卖为了提升成单量,必须帮助用户挖掘美食需求,如何推荐用户最适合自己的美食?
求两个集合的交、并、差集
sinter key1 [key2] …
sunion key1 [key2] …
sdiff key1 [key2] …
求两个集合的交、并、差集并存储到指定的集合中
sinterstore destination key1 [key2] …
sunionstore destination key1 [key2] …
sdiffstore destination key1 [key2] …
将指定数据从原始集合中移动到目标集合中
smove source destination member
set类型不允许数据重复,如果添加的数据在set中已经存在,将只保留一份
set虽然和hash的存储结构相同,但是无法启用hash中存储值的空间
集团公司共具有12000名员工,内部OA系统中具有700多个角色,3000多个业务操作,23000多种数据,每名员工具有一个或多个角色,如何快速进行业务操作的权限校验?
(当然真正的权限校验:现在有很多成熟的权限校验框架)
(只是用redis也可以做到这个事情)
第一种:称拿数据再到业务层作校验的这种形式,相对来说耦合度低一些。数据和业务是分散开的。
第二种:把业务校验这一步给融到数据这一层当中了。在取数据的时候把数据校验加进去了。
推荐使用第一种。。。
当然是基础数据即可。
公司对旗下新的网站做推广,统计网站的PV(访问量),UV(独立访客),IP(独立IP)。
PV:网站被访问次数,可通过刷新页面提高访问量。
UV:网站被不同用户访问的次数,可通过cookie统计访问量,相同用户切换IP地址,UV不变。
IP:网站被不同IP地址访问的总次数,可通过IP地址统计访问量,相同IP不同用户访问,IP不变。
黑名单
资讯类信息类网站追求高访问量,但是由于其信息类的价值,往往容易被不法分子利用,通过爬虫技术,快速获取信息,个别特种行业网站信息通过爬虫获取分析后,可以转换成商业机密进行销售。例如第三方火车票、机票、酒店刷票代购软件,电商刷评论、刷好评。
同时爬虫带来的伪流量也会给经营者带来错觉,产生错误的决策。有效避免网站被爬虫反复爬取成为每个网站都要考虑的基本问题。在基于技术层面区分出爬虫用户后,需要将此类用户进行有效地屏蔽,这就是黑名单的典型应用。
ps:不是说爬虫一定做摧毁性的工作。有些小型网站需要爬虫为其带来一些流量。
白名单
对于安全性更高的应用访问,仅仅靠黑名单是不能解决安全问题的。此时需要设定可访问的用户群体,依赖白名单做更为苛刻的访问验证。
服务控制的鉴定不在redis
score不是用来存数据的,而是用来排序的。
添加数据
zadd key score1 member1 [score2 member2] …
获取全部数据
zrange key start stop [WITHSCORES]
zrevrange key start stop [WITHSCORES]
删除数据
zrem key member [member …]
按条件获取数据
zrangebyscore key min max [WITHSCORES] [LIMIT]
zrevrangebyscore key max min [WITHSCORES]
条件删除数据
zremrangebyrank key start stop
zremrangebyscore key min max
获取集合数据总量
zcard key (有多少数据)
zcount key min max
集合交、并操作
zinterstore destination numkeys key [key …]
zunionstore destination numkeys key [key …]
eg:
这里就把67score删掉了。
sorted_set提供了一些与score有关的操作,删除、查询都有关。由于有顺序的概念,所以也提供按索引操作。
注意:
票选广东十大杰出青年,各类综艺选秀海选投票
各类资源网站TOP10(电影、歌曲、文档、电商、游戏等)
聊天室活跃度统计
游戏好友亲密度
注意:这里的返回值0,指的是value无法进入,但不是不能改。
基础服务+增值服务类网站会设定各类会员的试用,让用户充分体验会员优势。例如观影试用VIP、游戏VIP体验、云盘下载体验 VIP、数据查看体验VIP。当VIP体验到期后,如果有效管理此类信息。即便对于正式VIP用户也存在对应的管理方式。
网站会定期开启投票、讨论、限时进行、逾期作废。如何有效管理此类过期信息。
1)秒单位,下面那个是更小的单位
任务/消息权重设定应用
当任务或者消息待处理,形成任务队列或消息队列时,对于高优先级的任务要保障对其优先处理,如何实现任务权重管理。
多条件任务权重设定
如果权重条件过多时,需要对排序score值进行处理,保障score能够兼容2条件或者多条件,例如外贸订单优先于国内订单,总裁订单优先于员工订单,经理订单优先于员工订单。
虽然这样操作可以实现将权重高的剔除出去,但由于操作的非原子性,所以无法保证是否会有插队等。
事务可以解决。
现在是否有API可以解决这个事情???
人工智能领域的语义识别与自动对话将是未来服务业机器人应答呼叫体系中的重要技术,百度自研用户评价语义识别服务,免费开放给企业试用,同时训练百度自己的模型。现对试用用户的使用行为进行限速,限制每个用户每分钟最多发起10次调用。
为避免每次都需要判断,改良方案。
使用微信的过程中,当微信接收消息后,会默认将最近接收的信息置顶,当多个好友及关注的订阅号同时发送消息时,该排序会不停的进行交替。同时还可以将重要的会话设置为顶置。一旦用户离线后,再次打开微信时,消息该按照什么样的顺序显示?
注意:使用ttl命令,返回-2代表当前key不存在了。(time to live)
如果一个key存在,返回的是-1;
如果一个key设置了有效期,就返回现在所剩时长。
使用persist的时候,当key在有效期或者存在时,返回1
不存在时,返回0
注意:这时的str2已经存在。
使用sort命令时,默认升序,desc是降序。
eg:flushdb - 代表没有参数
Java程序操作redis的工具。
redis.clients
jedis
2.9.0
Jedis jedis = new Jedis("127.0.0.1", 6379);
jedis.set("name","liu");
String name = jedis.get("name");
System.out.println(name);
jedis.close();
①设定一个服务方法,用于模拟实际业务调用的服务,内部采用打印模拟调用
②在业务调用前服务调用控制单元,内部使用redis进行控制,参照之前的案例。
③对调用超限使用异常进行控制,异常处理设定为打印提示信息
④主程序启动3个线程,分别表示3中不同的用户的调用。
后续1:对业务控制方案进行改造,设定不同用户等级的判定
后续2:将不同用户等级对应的信息,限定次数等设定到redis中,使用hash保存。
public JedisPool(GenericObjectPoolConfig poolConfig,String host,int port){
this(poolConfig,host,port,2000,(String)null,0, (String)null);
}
redis.host = 127.0.0.1
redis.port = 6379
redis.maxTotal = 30
redis.maxIdle = 10
private static JedisPool jedisPool = null;
private static String host = null;
private static Integer port = null;
private static Integer maxTotal = null;
private static Integer maxIdle = null;
static {
ResourceBundle resourceBundle = ResourceBundle.getBundle("redis");
host = resourceBundle.getString("redis.host");
port = Integer.parseInt(resourceBundle.getString("redis.port"));
maxTotal = Integer.parseInt(resourceBundle.getString("redis.maxTotal"));
maxIdle = Integer.parseInt(resourceBundle.getString("redis.maxIdle"));
JedisPoolConfig jpc = new JedisPoolConfig();
jpc.setMaxIdle(maxIdle);
jpc.setMaxTotal(maxTotal);
jedisPool = new JedisPool(jpc,host,port);
}
public static Jedis getJedis(){
return jedisPool.getResource();
}