redis入门

包括7个方面:入门简介,可存储数据类型,配置文件解读,持久化机制,事务,复制,java操作客户端
一、reidis入门
    问题:MySQL数据库也经常存储一些大文本字段,导致数据库表非常的大,在做数据库恢复的时候就导致非常的慢,不容易快速恢复数据库。比如1000万4KB大小的文本就接近40GB的大小,如果能把这些数据从MySQL省去,MySQL将变得非常的小。关系数据库很强大,但是它并不能很好的应付所有的应用场景。MySQL的扩展性差(需要复杂的技术来实现),大数据下IO压力大,表结构更改困难。

    为什么使用NoSQL ?
    今天我们可以通过第三方平台(如:Google,Facebook等)可以很容易的访问和抓取数据。用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。我们如果要对这些用户数据进行挖掘,那SQL数据库已经不适合这些应用了, NoSQL数据库的发展也却能很好的处理这些大的数据。

    NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,
泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题,包括超大规模数据的存储。
    典型的nosql数据库库包括:redis,mongodb,hbase等。

    与传统sql数据库比较:
    RDBMS
- 高度组织化结构化数据
- 结构化查询语言(SQL)
- 数据和关系都存储在单独的表中。
- 数据操纵语言,数据定义语言
- 严格的一致性
- 基础事务

NoSQL
- 代表着不仅仅是SQL
- 没有声明性查询语言
- 没有预定义的模式
- 键值对存储,列存储,文档存储,图形数据库
- 最终一致性,而非ACID属性
- 非结构化和不可预知的数据
- CAP定理(一致性,可用性,分区容错性)
- 高性能,高可用性和可伸缩性

redis是一个c语言编写的分布式基于内存的高速缓存数据库。
经典应用,热门数据缓存,比如秒杀,电商网站商品描述信息
先启动redis然后才能进行下面的操作
linux环境下安装使用redis全步骤:
cd  /usr/
mkdir  redis
cd redis
wgethttp://download.redis.io/releases/redis-3.2.4.tar.gz  //下载redis
tar -xzf redis-3.2.4.tar.gz  //解压缩
cd redis-3.2.4
make  // 安装redis
src/redis-server
cd /usr/redis/redis-3.2.4
src/redis-cli
经过以上步骤,你的redis客户端就启动好啦
二、Redis数据类型
    五大数据类型:string,hash,list,set,sort set
    String(字符串)是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。string类型是Redis最基本的数据类型,redis中字符串value最多可以是512M
    Hash(哈希)Redis hash 是一个键值对集合。Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。类似Java里面的Map<String,Object>
    List(列表)Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。它的底层实际是个链表。
    Set(集合)Redis的Set是string类型的无序集合。它是通过HashTable实现实现的,
    zset(sorted set:有序集合)Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。 
   对数据的常见操作可以查看文档:http://redisdoc.com/
   另外,redis存储的数据可以设置过期时间。

三、Redis配置文件redis.conf
    参数说明
redis.conf 配置项说明如下:
1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
 daemonize no
2. 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
 pidfile /var/run/redis.pid
3. 指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字
 port 6379
4. 绑定的主机地址
 bind 127.0.0.1
5.当 客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
 timeout 300
6. 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
 loglevel verbose
7. 日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
 logfile stdout
8. 设置数据库的数量,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id
 databases 16
9. 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
 save <seconds> <changes>
 Redis默认配置文件中提供了三个条件:
 save 900 1
 save 300 10
 save 60 10000
 分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。

10. 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
 rdbcompression yes
11. 指定本地数据库文件名,默认值为dump.rdb
 dbfilename dump.rdb
12. 指定本地数据库存放目录
 dir ./
13. 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
 slaveof <masterip> <masterport>
14. 当master服务设置了密码保护时,slav服务连接master的密码
 masterauth <master-password>
15. 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭
 requirepass foobared
16. 设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息
 maxclients 128
17. 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
 maxmemory <bytes>
18. 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
 appendonly no
19. 指定更新日志文件名,默认为appendonly.aof
 appendfilename appendonly.aof
20. 指定更新日志条件,共有3个可选值: no:表示等操作系统进行数据缓存同步到磁盘(快)?
 always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)?
 everysec:表示每秒同步一次(折衷,默认值)
 appendfsync everysec
21. 指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析Redis的VM机制)
 vm-enabled no
22. 虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享
 vm-swap-file /tmp/redis.swap
23. 将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0
四、redis持久化
    redis相对于Memcached好处之一就是支持持久化,它有两种持久化方式
    1、RDB(Redis DataBase),就是以快照的方式 在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是Snapshot快照,它恢复时是将快照文件直接读到内存里,
    原理:Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。
    rdb 保存的是dump.rdb文件,放在安装目录下
    启用方式:修改默认的appendonly no,改为yes
    如何触发RDB快照:命令save或者是bgsave(这时候会生成一个dump.rdb文件)
    2、AOF(Append Only File)以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),
只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
    原理:AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,
当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,
只保留可以恢复数据的最小指令集.可以使用命令bgrewriteaof
   Aof保存的是appendonly.aof文件
   比较:
   相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdb。aof文件优先于rdb加载。
   RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储
   另外redis 也支持数据淘汰(6种淘汰算法),默认不开启此机制,实际使用中一定要有淘汰机制,可在前面提到的配置文件中开启相关配置。

五、Redis事务
    redis支持弱的一致性,就是没有回滚机制
    redis事务指:可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞。但是redis事务不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。
    使用:开启:以MULTI开始一个事务;入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面;执行:由EXEC命令触发事务
    原理:通过WATCH命令在事务执行之前监控了多个Keys,倘若在WATCH之后有任何Key的值发生了变化,
EXEC命令执行的事务都将被放弃,同时返回Nullmulti-bulk应答以通知调用者事务执行失败。Watch指令,类似乐观锁,事务提交时,如果Key的值已被别的客户端改变,比如某个list已被别的客户端push/pop过了,整个事务队列都不会被执行


六、Redis复制
    由于单机性能的限制,读写分离技术已经广泛用于数据库,分布式中间件等场景中。
    指主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主。从而实现读写分离,容灾备份。
    使用:只需要配置从数据库;从库配置命令行:slaveof 主库IP 主库端口,也可以在配置文件中配置。
    常用的配置方式:
    1、一主二从  一个Master两个Slave
    2、主从一致  上一个Slave可以是下一个slave的Master,Slave同样可以接收其他slaves的连接和同步请求,那么该slave作为了链条中下一个的master,可以有效减轻master的写压力
    3、主从变更 使当前数据库停止与其他数据库的同步,转成主数据库
    info replication命令可以查看是主机还是从机
    复制原理:slave启动成功连接到master后会发送一个sync命令,Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步,全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步
    哨兵模式:哨兵模式可以防止主机瘫痪,自动选举主机,而不需要手动设置。它是一个独立的进程监控redis服务器是否正常运行。监控过程分两步:1)发送命令,redis服务器返回其运行状态,包括主服务器和从服务器。2)当哨兵检测到master节点宕机后,会自动切换slave成master,通过发布订阅模式通知到其它服务器,修改配置文件,切换他们的主机。
     配置方式修改redis安装目录下sentinel配置文件, sentinel monitor 被监控数据库名字(自己起名字) 127.0.0.1 6379 1   ,redis-sentinel /myredis/sentinel.conf 
七、Redis java客户端
    Jedis使用,导入jar包:commons-pool-1.6.jar,jedis-3.2.4.jar
    测试连通性:
    public class Demo01 {
     public static void main(String[] args) {
 //连接本地的Redis服务
    Jedis jedis = new Jedis("127.0.0.1",6379);
  //查看服务是否运行,打出pong表示OK
    System.out.println("connection is OK==========>: "+jedis.ping());
    }
    }
    Jedis事务操作:
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Response;
import redis.clients.jedis.Transaction;


public class Test03
{
  public?static?void?main(String[] args)?
  {
      Jedis jedis = new Jedis("127.0.0.1",6379);
       //监控key,如果该动了事务就被放弃
/*3
      jedis.watch("serialNum");
      jedis.set("serialNum","s#####################");
      jedis.unwatch();*/

     Transaction transaction = jedis.multi();//被当作一个命令进行执行
     Response<String> response = transaction.get("serialNum");
     transaction.set("serialNum","s002");
     response = transaction.get("serialNum");
     transaction.lpush("list3","a");
     transaction.lpush("list3","b");
     transaction.lpush("list3","c");
     transaction.exec();
     //2 transaction.discard();
     System.out.println("serialNum***********"+response.get());
    }
    更多Jedis使用参考相关文档
    Spring中使用Redis:   下载spring-data-redis.jar包,
    spring提供redistemplate对象操作Redis,使用之前需要先配置连接工程,和mysql一样,
使用示例:Redistemplate保存对象:
ApplicationContext appllicationContext = new ClassPathXmlcation Context("applicationCeontext.xml");
RedisTemplate redistemplate = applicationContext.getbean(RedisTempate.class);
Role role = new Role();
role.setId(1L);
role.setRolename("helohord");
role.setNote("note_1")
redistemplate.opsForValue().set("note_1",role);

最后一些面试题
redis的底层存储结构?
redis相对于类似缓存数据库优缺点?
redis主从复制详细过程?
缓存与数据库的一致性保证?
redis分布式锁的实现与使用?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值