Redis 简单些一点笔记


1:Redis是一个什么东西哪?


     是一个内存数据库


2:Redis有什么特点哪?


     具有内存的特点——快、断电即逝


     具有数据的特点——主要用来存储数据,可以进行对数据的增删改查


3:我们用Redis主要是为什么哪?毕竟有好多种其他的数据库了?


     我们使用这个东西,核心目标就是为了快,为了提高性能,我们不把他当做数据库来使用,我们把它当做缓存


4:缓存是啥玩意?


      学习过计算机操作系统的也许都知道缓存是什么东西吧!如果没有学习过,并在北京工作的话,我想一定做过北京地铁吧!地铁上下班高峰的时候,使用围栏的方式将人流拦在列车之外的方式,类极了缓存的控制方式!


      更通俗一点就是,我们将数据放到运行速度更快的地方,这样等我们使用的时候就能以更快的速度来获取了,这个更快的地方就是——缓存


5:Redis不是内存数据库吗?怎么又是缓存了哪?


      因为他是内存数据库,所以他速度快,并且能存放数据,加上另外一个特性——数据的过期时间,这样他就能当做缓存来使用了!


6:我们在实际的开发中都是怎么使用redis这个缓存的哪?


      我们首先将数据放入数据库中,然后通过手动或者定时器的方式将我们认为有效的数据放入redis中,并且为其设置一个过期时间,以后我们的程序依赖数据的时候就直接从缓存中获取!这样确实能够使程序的获取数据的速度变快很多很多的!不信自己试试吧!


7:我们使用缓存有什么需要注意的地方哪?


      需要注意的地方估计不少,不过我只能想到以下几点而已:


      1)防止缓存出现空档期,我们刷新缓存的时候应该先加入有效的数据,再删除无效的数据


      2)合理的设计key,因为redis是通过键值对来存储数据的,设计的不好引起键的冲突就不好了,为了节省空间,最好长度也要合适才行


      3)如果我们的数据获取全部依赖缓存,我们缓存必须高可用、高性能、易扩展、易维护才行


      4)缓存的空间是有限的,所以,合适的过期时间以及空间不够时采用什么策略丢弃那些数据也挺重要的


      5)要考虑好缓存不可用了怎么办?


Redis是一个开源的C语言编写,遵守BSD,支持网络,可基于内存可持久化的日志型,key-Value数据库,并提供多种语言API


被称为数据结构服务器:因为值(value)可以是字符串(String),哈希(Map),列表(list).集合(sets),有序集合(sorted sets)等类型

可以借助可视化的软件:Redis Desktop Manager

redis可以代替ES做全文检索吗 redis代替数据库_Redis


Redis简介



Redis和其他key-value缓存产品有以下三个特点:



1.redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载使用

2.redis不仅仅支持简单的key-value类型数据,同事还可以提供list,set,zset,hash等数据结构的存储

3.redis吃吃数据备份,即master-slave模式的数据备份





redis优势:



1.性能极高

2.丰富的数据类型:支持二进制string,list,Hashes,sets,ordered sets数据类型操作

3.原子性:要么执行失败完全不执行,单个操作是原子性的,多个操作也支持事物,即原子,通过MULTI,EXEC指令包起来

4.丰富的特性:redis支持publish,subscribe,通知,key过期等特性



Redis与其他key-value存储有什么不同?

1.Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。

2.Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。



扩展:



什么是原子性,什么是原子性操作?



举个例子:



A想要从自己的帐户中转1000块钱到B的帐户里。那个从A开始转帐,到转帐结束的这一个过程,称之为一个事务。在这个事务里,要做如下操作:



 1. 从A的帐户中减去1000块钱。如果A的帐户原来有3000块钱,现在就变成2000块钱了。

 2. 在B的帐户里加1000块钱。如果B的帐户如果原来有2000块钱,现在则变成3000块钱了。

如果在A的帐户已经减去了1000块钱的时候,忽然发生了意外,比如停电什么的,导致转帐事务意外终止了,而此时B的帐户里还没有增加1000块钱。那么,我们称这个操作失败了,要进行回滚。回滚就是回到事务开始之前的状态,也就是回到A的帐户还没减1000块的状态,B的帐户的原来的状态。此时A的帐户仍然有3000块,B的帐户仍然有2000块。



我们把这种要么一起成功(A帐户成功减少1000,同时B帐户成功增加1000),要么一起失败(A帐户回到原来状态,B帐户也回到原来状态)的操作叫原子性操作。



如果把一个事务可看作是一个程序,它要么完整的被执行,要么完全不执行。这种特性就叫原子性。





radis安装后测试:



1.把文件解压下载到:C:\Redis\Redis 



2.cmd进入c盘,在c盘的目录下运行redis-server.exe Redis.conf 



3.新开一个CMD窗口做测试,进入根目录输入redis-cli.exe



4.

redis> HMSET myhash field1 "Hello" field2 "World"
 "OK"
 redis> HGET myhash field1
 "Hello"
 redis> HGET myhash field2
 "World"

以上实例中 hash 数据类型存储了包含用户脚本信息的用户对象。 实例中我们使用了 Redis HMSET, HGETALL 命令,user:1 为键值。



每个 hash 可以存储 232 -1 键值对(40多亿)。

List(列表)

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。



实例

redis 127.0.0.1:6379> lpush runoob redis
 (integer) 1
 redis 127.0.0.1:6379> lpush runoob mongodb
 (integer) 2
 redis 127.0.0.1:6379> lpush runoob rabitmq
 (integer) 3
 redis 127.0.0.1:6379> lrange runoob 0 10
 1) "rabitmq"
 2) "mongodb"
 3) "redis"
 redis 127.0.0.1:6379>

列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。



Set(集合)

Redis的Set是string类型的无序集合。



集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。



sadd 命令

添加一个string元素到,key对应的set集合中,成功返回1,如果元素已经在集合中返回0,key对应的set不存在返回错误。



sadd key member

实例

redis 127.0.0.1:6379> sadd runoob redis
 (integer) 1
 redis 127.0.0.1:6379> sadd runoob mongodb
 (integer) 1
 redis 127.0.0.1:6379> sadd runoob rabitmq
 (integer) 1
 redis 127.0.0.1:6379> sadd runoob rabitmq
 (integer) 0
 redis 127.0.0.1:6379> smembers runoob



1) "rabitmq"

2) "mongodb"

3) "redis"

注意:以上实例中 rabitmq 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。



集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。



zset(sorted set:有序集合)

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。

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



zset的成员是唯一的,但分数(score)却可以重复。



zadd 命令

添加元素到集合,元素在集合中存在则更新对应score



zadd key score member 

实例


redis 127.0.0.1:6379> zadd runoob 0 redis
 (integer) 1
 redis 127.0.0.1:6379> zadd runoob 0 mongodb
 (integer) 1
 redis 127.0.0.1:6379> zadd runoob 0 rabitmq
 (integer) 1
 redis 127.0.0.1:6379> zadd runoob 0 rabitmq
 (integer) 0
 redis 127.0.0.1:6379> ZRANGEBYSCORE runoob 0 1000

1) "redis"

2) "mongodb"

3) "rabitmq"