redis介绍

Redis缓存

1.什么是Redis?
Redis是基于内存,使用C语言开发,需要使用gcc编程进行编译。它的数据模型key-value。
redis又叫内存数据库,非关系型数据库,nosql数据库
Redis 是一个单线程,不存在线程安全问题,很多命令可以作为锁来用,如:setnx
Redis的读速度为11万/s,写速度为8.1万/s

2.关系型和非关系型的区别
关系型数据库:可以用一张二维表格来表示现实世界中对象,并存储的数据库。如:Oracle,MySQL,sqlserver
非关系型数据库:通常用key-value来进行数据库描述和存储的数据库。如redis,mogodb(文档–类似表)

区别: 非关系型数据库 关系型数据库
存储介质: 内存 磁盘
存取数据速度: 相当快 相对慢
缺点: 数据断电丢失 永久存储数据
因为内存中存储数据,断电易丢失,因此需要对redis进行持久化操作(内存中的数据刷到磁盘中保存)

3.Redis 五种数据结构及其应用场景
String
相当于map结构:key-value
语法:
set key value 存储数据到redis
get key 取数据
expire key timeout 设置key 过期时间
举例: expire abc 3*60 表示abc这个key3分钟以后会从redis中删除
incr key 原子自增1 可以生成订单的或者商品的id (保证不重复)
举例 set id 10
incr id —> id 变成11
decr key 原子自减1 【并发减库存】
Hash
大map套小map
如:

Key1 -field1 -value1		
Key1 -field2 -value2
Key2 -field1 -value1
Key2 -field2 -value2

hset key1 field1 value 设置key1下的小key field1的value值
hget key1 filed2 去key1下的小key field1的value值
主要用于对key分类! 主要电商用于设计购物车!【用户登录用redis设计购物车】【用户未登录cookie】

List
List结构即为双向链表结构,使用list结构,我们可以实现最新消息排行
使用场景:微博评论

Set
Redis Set与list的区别就是set可以自动去重
Sortset(zset)
Sorted Set额外提供一个优先级(score)参数为成员提供排序功能,并且插入 式有序的,即自动排序。

4.持久化
redis数据都在内存中,数据断电丢失。因此需要持久化!
RDB快照【默认】
保存数据到磁盘规则:
save 秒 变化的key

save 900 1 15分钟至少有一个key被改变 向磁盘保存一次
save 300 10 5分钟至少10个	key被改变 向磁盘保存一次
save 60 10000 1分钟至少10000个key被改变要 向磁盘保存一次

效率高,可能会丢数据。
AOF(文件追加)
产生一个文件,记录你的所有操作的命令。redis死了,重新执行这个文件。所有redis的数据就会恢复。
效率低,数据完整度高。

5.Redis内存的缓存淘汰策略 LRU算法
http://www.redis.cn/topics/lru-cache.html
6.Redis缓存产生问题
【1】redis消息队列问题
【2】redis产生的问题(雪崩,击穿)
大白话:大量请求,请求redis中不存在的key,这个时候大量请求打到数据库,产生数据库连接池异常 (连接被干完了),数据库挂了!
A.java 互斥锁(ReentrantLock)单机使用

B .setnx (分布式锁) 【推荐,多线程】 (单机集群都可以使用)

/*
如何使用缓存
1.查询缓存
1.1命中  返回
1.2查询数据库,写入缓存 返回
*/


public String getValueFromRedis ( String key ){
    String value = redis.get( key );
  }
/*
setnx (key,value ) ; 返回值是true 或者false
参数key: exits_redis+key
当我们key存在 false  key不存在是true
第一条线程进来分布式锁redis.setnx("existKey",1) true
从数据库获取value
存储到redis中
给分布式锁的existKey设置60秒的存活时间,防止一直存在
删除掉existKey
第二条线程进不来了redis.setnx("existKey",1) false
先沉睡50毫秒
这时候value已经存在了
返回value
*/

     if ( value = = null ){ 
           if ( redis.setnx ( “existKey”,1 ) ) { 

           value = db.get ( key );
           redis.set ( key,value );
           redis.exprire ( “existKey” , 1*60 );
           redis.delete ( “existKey” );
           return value;
	   } else {
           	Thread.sleep ( 50 );
             value = redis.get ( key);
             return value;
		}
	 }
	return value;  
	}

C.布隆过滤器

【3】数据库数据如何转存redis
7.什么时候使用缓存?
访问频率高
读多写少的任务
一致性要求不高(首页广告)

8.100W用户同时注册,要求用户名不重复
分析:100w 高并发 关系型数据库 pass
Redis 可以
数据库中的用户表 转存到redis
怎么存数据库中的表呢?

user   
id   name       sex
1	 zhangsan   女
2    lisi	    男

核心问题:如何把数据库中表转存到redis。(解决高并发,用户信息还要永久保存)
解决:

把redis数据再同步到数据库(设置一个定时任务:分批同步【每分钟同步100条】 减少数据库压力)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值