Redis是一个高性能的key-value型数据库。Redis能读的速度是110000次/s,写的速度是81000次/s ,性能极高。Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的,多个操作支持事务。

Redis是运行在内存中的,因此速度极快,由于数据是在内存中,关机后数据将丢失,但是redis是支持数据持久化的,将数据保存到磁盘中,重启的时候可以再次加载进行使用。

1.Redis使用场景:

数据实时性要求高,数据存储有过期和淘汰特征的,不需要保证弱一致性,逻辑简单的场景。

具体如下:

(1)缓存

缓存现在几乎是所有中大型网站都在用的必杀技,合理的利用缓存不仅能够提升网站访问速度,还能大大降低数据库的压力。Redis提供了键过期功能,也提供了灵活的键淘汰策略,所以,现在Redis用在缓存的场合非常多。

(2)排行榜

很多网站都有排行榜应用的,如京东的月度销量榜单、商品按时间的上新排行榜等。Redis提供的有序集合数据类型能实现各种复杂的排行榜应用。

(3)计数器

什么是计数器,如电商网站商品的浏览量、视频网站视频的播放数等。为了保证数据实时效,每次浏览都得给+1,并发量高时如果每次都请求数据库操作无疑是种挑战和压力。Redis提供的incr命令来实现计数器功能,内存操作,性能非常好,非常适用于这些计数场景。

(4)分布式会话

集群模式下,在应用不多的情况下一般使用容器自带的session复制功能就能满足,当应用增多相对复杂的系统中,一般都会搭建以Redis等内存数据库为中心的session服务,session不再由容器管理,而是由session服务及内存数据库管理。

(5)分布式锁

在很多互联网公司中都使用了分布式技术,分布式技术带来的技术挑战是对同一个资源的并发访问,如全局ID、减库存、秒杀等场景,并发量不大的场景可以使用数据库的悲观锁、乐观锁来实现,但在并发量高的场合中,利用数据库锁来控制资源的并发访问是不太理想的,大大影响了数据库的性能。可以利用Redis的setnx功能来编写分布式的锁,如果设置返回1说明获取锁成功,否则获取锁失败,实际应用中要考虑的细节要更多。

2.Redis数据类型

string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

set是无序的String集合,zset是有序的String集合,zset中除了有String类型外,还有double类型并根据double值的大小来进行排序。

3.在Java中使用Redis

Jedis是在java中用来操作Redis的工具。

下载驱动包jedis.jar,并将该驱动包包含在classpath下,同时需具备java环境和redis环境。

applicationContext.xml中添加 :

     <!-- 读取配置文件信息 -->
<context:property-placeholder location="classpath:redis.properties" file-encoding="UTF-8" ignore-unresolvable="true"/> <!-- Jedis 连接池配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="${redis.pool.maxTotal}"/>
<property name="maxIdle" value="${redis.pool.maxIdle}"/>
<property name="maxWaitMillis" value="${redis.pool.maxWaitMillis}"/>
<property name="testOnBorrow" value="${redis.pool.testOnBorrow}"/>
</bean> <bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg ref="jedisPoolConfig"/>
<constructor-arg value="${jedis.host}" type="java.lang.String"/>
<constructor-arg type="int" value="${jedis.port}"/>
</bean>

redis.properties:

# 控制一个pool可分配多少个jedis实例
redis.pool.maxTotal=1000
# 控制一个pool最多有多少个状态为idle(空闲)的jedis实例
redis.pool.maxIdle=200
# 表示当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException
redis.pool.maxWaitMillis=2000
#在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的
redis.pool.testOnBorrow=true
# redis 单机
# 单机 host
jedis.host=127.0.0.1
# 单机 port
jedis.port=6379

java类:

@Autowired
private JedisPool jedisPool; public Jedis getJedis() {
Jedis jedis = this.jedisPool.getResource();
// 使用index为2的database
jedis.select(2);
return jedis;
} public void set(String key, String value, int seconds) {
Jedis jedis = null;
try {
jedis = getJedis();
jedis.setex(key, seconds, value);
Long exp = jedis.ttl(key);
if (exp < 0) {
throw new RuntimeException("data time out!");19 }
} catch (Throwable e) {
logger.error(e.getMessage(), e);
throw new TokenException(e.getMessage());
} finally {
if(jedis != null){jedis.close;}
}
}

4. C#中Redis的使用

(1)需要的相关dll

(2)在配置文件中添加Redis本地的IP地址和端口号

(3)后台代码中获取IP和端口号,添加获取PooledRedisClientManager实例的方法CreateManager()

string RedisServerIP = ConfigurationManager.AppSettings["RedisServerIP"].ToString();
string RedisServerPort = ConfigurationManager.AppSettings["RedisServerPort"].ToString();
public PooledRedisClientManager CreateManager()
{
//支持读写分离,均衡负载,负载均衡需要单独部署
return new PooledRedisClientManager(new string[] { RedisServerIP + ":" + RedisServerPort }//用于写
, new string[] { RedisServerIP + ":" + RedisServerPort }//用于读
, new RedisClientManagerConfig
{
MaxWritePoolSize = ,//“写”链接池链接数
MaxReadPoolSize = ,//“写”链接池链接数
AutoStart = true, });
}

(4)从Redis中读取数据

PooledRedisClientManager prcm = CreateManager();
using (IRedisClient Redis = prcm.GetClient())
{
string name = Redis.Get<string>("name");
}

(5)向Redis中写入数据

Redis.Set("name","Bryant24");

因为上面prcm调用的是GetClient()方法,所以Redis可以进行读写操作。如果调用的是GetReadOnlyClient(),则只能进行从redis中读取数据。

(6)如下图,表示redis连接成功,左边四个是存储的键值对。

5.Redis进阶之主从复制(master-slave模式)

**主从复制,就是缓存分别存放在主库和从库上,当主库坏了以后,从库代替,实现故障恢复、高可用。

Redis的master-slave能够提高系统的可用性,master节点写入cache后,会自动同步到slave节点上。

环境:

master node: 10.6.144.155:7030

slave node: 10.6.144.156:7031

配置:在slave node上slaveof这行加上master node的ip和端口号

slaveof  10.6.144.155:7030

tip: slave-read-only yes表示slave只读不写

验证:启动这两台机器,给master节点加一个缓存项:

set a "master-cache-data"

在slave节点中取出该缓存项:

get a

如果取到了,说明master上的cache复制到了slave上。

 

Redis基础知识小结的更多相关文章

  1. javascript之正则表达式基础知识小结

    javascript之正则表达式基础知识小结,对于学习正则表达式的朋友是个不错的基础入门资料.   元字符 ^ $ . * + ? = ! : | \ / ( ) [ ] { } 在使用这些符号时需要 ...

  2. redis基础知识详解

    一.redis基础知识 1.Redis是什么Redis是一个开源的key-value存储系统. 和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表 ...

  3. 【进阶之路】Redis基础知识两篇就满足(二)

    导言 大家好,我是南橘,一名练习时常两年半的java练习生,这是我在博客园的第二篇文章,当然,都是要从别处搬运过来的,不过以后新的文章也会在博客园同步发布,希望大家能多多支持^_^ 这篇文章的出现,首 ...

  4. 【进阶之路】Redis基础知识两篇就满足(一)

    导言 大家好,我是南橘,一名练习时常两年半的java练习生,这是我在博客园的第一篇文章,当然,都是要从别处搬运过来的,不过以后新的文章也会在博客园同步发布,希望大家能多多支持^_^ 这篇文章的出现,首 ...

  5. Redis 02: redis基础知识 + 5种数据结构 + 基础操作命令

    Redis基础知识 1).测试redis服务的性能: redis-benchmark 2).查看redis服务是否正常运行: ping 如果正常---pong 3).查看redis服务器的统计信息: ...

  6. redis基础知识思维导图

    看到一张redis的基础知识思维导图,比较清晰, 但是没有标明来源,希望知道的给个地址,我也好说明来源 图大小有1M多.在博客上看比较模糊,可以先下载下来查看,或者在浏览器新标签中打开图片查看,就比较 ...

  7. Redis基础知识补充及持久化、备份介绍(二)--技术流ken

    Redis知识补充 在上一篇博客<Redis基础认识及常用命令使用(一)--技术流ken>中已经介绍了redis的一些基础知识,以及常用命令的使用,本篇博客将补充一些基础知识以及redis ...

  8. 老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化

    引言 今天周末,我在家坐着掐指一算,马上又要到一年一度的金九银十招聘季了,国内今年上半年受到 YQ 冲击,金三银四泡汤了,这就直接导致很多今年毕业的同学会和明年毕业的同学一起参加今年下半年的秋招,这个 ...

  9. Redis基础知识补充及持久化、备份介绍

    Redis知识补充 在上一篇博客<Redis基础认识及常用命令使用(一)–技术流ken>中已经介绍了redis的一些基础知识,以及常用命令的使用,本篇博客将补充一些基础知识以及redis持 ...

随机推荐

  1. shell脚本的一些常用操作

    字符串长度: ${#string}可获取string字符串的长度,如下: jenkins@soft1pc:~$ str="who are you"jenkins@soft1pc:~ ...

  2. 2018-2019-2 网络对抗技术 20165335 Exp3 免杀原理与实践

    一.免杀原理与基础知识: (1)杀软是如何检测出恶意代码的? 检测特征码:特征码就是一般程序都不会有的代码,而后门有的那种特别的数据,而一个程序,应用有这种代码,数据的话,就直接判定为恶意代码. 主流 ...

  3. volatile CAS

    减少上下文切换的方法有无锁并发编程.CAS算法.使用最少线程和使用协程. 无锁并发编程.多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以用一 些办法来避免使用锁,如将数据的ID按照Hash ...

  4. 搭建一个简单的Eureka程序

    Eureka集群主要有三个部分Eureka服务器,服务提供者,服务调用者 简单的来说就是服务提供者将服务注册到Eureka服务器,服务调用者对其服务进行查找调用. Eureka服务程序的搭建可参考官方 ...

  5. 深入理解泛型之JAVA泛型的继承和实现、泛型擦除

    很多的基础类设计会采用泛型模式,有些应用在使用的时候处于隔离考虑,会进行继承,此时子类如何继承泛型类就很讲究了,有些情况下需要类型擦除,有些情况下不需要类型擦除,但是大多数情况下,我们需要的是保留父类 ...

  6. 【题解】Luogu P5284 [十二省联考2019]字符串问题

    原题传送门 我用sa做的本题 (码量似乎有点大) 先对原串建sa 考虑如何建图: 从大到小枚举长度len 先将height中等于len的两个位置在并查集合并起来,将lst也合并(lst是链表) 再将长 ...

  7. Linux学习方法和心态

    如果单纯是为了架站,那我就可以毕业了. 成就感+兴趣=学习的动力. 不同的环境下,解决问题的办法有很多种,只要行得通,都是好方法. Distribution 安装 熟悉Shell环境 Shell脚本 ...

  8. 中间件详解,Django复习

    day74 2018-05-21 课程安排周一: 中间件 auth模块+分析BBS项目需求(小组讨论把表结构设计出来) 1. 今日内容 中间件:http://www.cnblogs.com/liwen ...

  9. django url 反响解析,视图

    1. 内容回顾 1. 模板语言(字符串替换) 1. 母版和继承 1. 什么时候用母版? html页面有重复的代码,把它们提取出来放到一个单独的html文件. (比如:导航条和左侧菜单) 2. 子页面如 ...

  10. Bootstrap3基础 栅格系统 1行最多12列

      内容 参数   OS   Windows 10 x64   browser   Firefox 65.0.2   framework     Bootstrap 3.3.7   editor    ...