1.6.redis

redis数据库

1.redis有什么用?

redis是一套基于内存的nosql(非关系型)数据库,日常redis+mysql。

关系型数据库:mysql,oracle,sqlserver,统一的sql标准。突出的是数据的安全,事务。缺点:大数据量情况下,查询效率(索引).

非关系型数据库: memcached,redis,hbase,mongodb

KV数据库:memcached,redis(C语言编写,单线程的操作)

文档型数据库:mongodb(存的是json对象),与mysql最相似的一套非关系型数据库,能够替代mysql。金融行业的应用。兴趣研究这个mongodb

列式数据库:hbase,大数据开发使用(亿兆级别的数据)。

主要目的为了:提高查询效率;用户高并发场景;大数据量。

2.安装redis服务端与客户端

服务端:解压版,安装版

  • 核心配置文件:redis.window.conf:
配置端口:port 6379
默认数据库个数,数据库名称0-15:databases 16
rdb数据持久化策略:
    save 900 1
    save 300 10
    save 60 10000
rdb持久化文件名:dbfilename dump.rdb
持久化文件路径:dir ./
客户端连接密码:requirepass foobared
aof数据持久化是否开启:appendonly no
aof数据库持久化文件名:appendfilename "appendonly.aof"
aof数据持久化策略:
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    
rdb按照设定的时间点去持久化数据,存的是kv数据。a 10
aof每秒去持久化一次数据,存的是操作指令.set a 10
  • 启动服务端:redis-server.exe
进入安装目录:redis-server.exe redis.windows.conf
  • 客户端连接程序:redis-cli.exe
redis-cli.exe -h 127.0.0.1 -p 6379 -a root
  • 修复aof文件用的:redis-check-aof.exe
redis-check-aof.exe --fix appendonly6379.aof
  • redis-check-dump.exe
redis-check-dump.exe --fix dump6379.rdb
  • 安装可视化客户端程序
redis-desktop-manager

3.redis的五种数据类型操作指令

redis相对于memcached,有丰富的数据类型。key:String,Value:String,Hash,List,Set,Zset

String:对象转成的json字符串,数字,

设置,没有时插入 set:set key value [expiration EX seconds|PX milliseconds] [NX|XX];
获取 get:get key,
数值自增1 incr:incr key,
数值自减1 decr:decr key,
数值自定义增加 incrby:incrby key increment,
数值自定义减少 decrby:decrby key decrement,
设置定时删除的信息 setex:setex key seconds value,
仅当不存在时设置setnx:setnx key value,
获取原有数值设置新数值getset:getset key value,
临时缓存一个对象:比如缓存登录用户对象;比如存储临时验证码数据;结合着ex设置超时时间一起使用
计数器:结合着incr和decr,incrby,decrby一起使用,比如秒杀商品数量,数据库自增id计数器,文件下载量,用户积分数;
分布式锁:setnx
复合指令:getset,确保原子性,执行多次redis操作

重要:set,get,incr,decr

Hash:适合获取集合中指定数据,或者全部数据应用场景

给某个key下设置field和对应的value hset:hset key field value,
获取某个key下某个field的value hget:hget key field,
获取某个key下的所有field hkeys:hkeys key,
获取某个key下的所有value hvals:hvals key,
判断key下field是否存在返回(0/1) hexists: hexists key field,
删除key下某一field hdel:hdel key field [field ...],
获取某个key下所有的filed和value hgetall:hgetall key,
获取某个key的信息条数 hlen:hlen key,
给某key下某个filed的value增加自定义数值 hincrby:hincrby key field increment,
批量获取key下的指定filed hmset:hmset key field value [field value ...],
批量设置key下的指定filed hmget hmget key field [field ...]:
存储集合型的数据,适合按照field获取指定数据,或者或者key或value的集合。

List:有序数据集,适合于获取指定索引区间的数据,获取全部数据,或者弹出数据

向key中添加value lpush:lpush key value [value ...],
弹出对应key下的一个value lpop:lpop key,
排序输出集合的start位到stop位lrange: lrange key start stop,
获取集合的长度llen:llen key,
根据index取集合的单值 lindex:lindex key index,
给已存在的index中赋值 lset:lset key index value
存储集合型的数据,适合于批量获取集合中的数据。

Set:适合于做多个集合之间的交并差操作;适合于纯随机的数据获取

给集合添加元素 sadd:sadd key member [member ...],
弹出一个元素 spop:spop key [count],
获取所有元素 smembers: smembers key,
集合之间差集 sdiff:sdiff key [key ...],
集合之间并集 sunion:sunion key [key ...],
集合之间交集 sinter:sinter key [key ...]

ZSet:排序集合,适合所有需要排名的业务(直播系统中的粉丝数排名,电商系统中销量,考虑成绩排名,对战积分排名)

zadd:插入数据
zrange:根据排名区间获取成员集合,score升序排名
zrevrange:根据排名区间获取成员集合,score降序排名
zscore:获取指定成员的成绩值。
zcount:获取指定成绩区间内的成员个数。
zrangebyscore:获取成绩区间内的成员集合,score升序排名
zrevrangebyscore:获取成绩区间内的成员集合,score降序排名
zincrby:修改集合中指定成员的成绩。
zrank:获取指定成员的排名。score升序排名。
zrevrank:获取指定成员的排名。score降序排名。

其它:

​ 切换库:select index索引号

​ key的相关操作指令:

keys 获取所有key,
del 删除指定key,
exists 判断key是否存在,
type 判断key类型,
expire 设置倒计时,
ttl 查看倒计时

总结:

项目中使用redis:
热频数据:(系统用户,字典项,用户权限,热搜,首页推荐的直播)
临时数据:(验证码,使用httpsession保存的临时登录用户改为redis存)
面向大前端接口中的数据库查询:(引入redis缓存,查询的时候先查redis,redis有则返回;redis没有则查询数据库,并把查询结果放缓存)。

对于热频数据或者数据库查询结果缓存会带来的问题:
数据同步:缓存中数据与mysql数据库中的数据同步。一般update,delete仍然保持原来的mysql操作,但是需要对缓存中数据设置有效期。对于update与delete与insert操作缓存,异步线程来操作mysql数据库。

为数据设置有效期又会带来问题:
缓存的击穿:由于缓存中数据同一时刻大量失效。(在加载mysql数据到缓存设置有效期时,不要设置统一的超时时间).

常用指令:
String,Hash,List
String:set,get,incr,decr,getset
hash:hset,hget,hexists,hdel,hkeys,hvals,hlen
list:lpush,lpop,lrange

4.jedis客户端api的使用

  • jedis环境
添加jedis的jar包jedis-2.7.2.jar;
添加commons-pool2.jar;
  • 单机使用。
//连接池配置
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMinIdle(10);
        config.setMaxTotal(100);
        config.setLifo(true);//lastinFirstOut
        //创建连接池对象,该对象应该全局唯一的。
        JedisPool pool = new JedisPool(config,"127.0.0.1",6379,3000,"root");

        //从连接池得到一个Jedis连接对象
        Jedis resource = pool.getResource();
        //向redis中插入String字符串数据
        Sysuser u = new Sysuser(100,"admin","1551231231","123","admin@163.com");
        resource.set(u.getUphone(),JSON.toJSONString(u));

        String a = resource.get(u.getUphone());
        //json字符串转对象
        Sysuser sysuser = JSON.parseObject(a, Sysuser.class);
        System.out.println(sysuser);
        resource.close();
  • 客户端分片集群使用

redis的集群的产生原因:为了保证redis的高可用性(某台服务器挂了,不影响程序使用);单台redis存储的数据量有限。

redis集群方案:

客户端分片集群:redis服务器默认存在16384个哈希槽。由多台redis服务器均分这些哈希槽,不可扩展。无法确保高可用。

服务端的哨兵集群;服务端的cluster终极集群方案。

5.jedis整合ssm

properties文件

redis.minIdle=10
redis.MaxTotal=100
redis.host=127.0.0.1
redis.port=6379
redis.timeout=3000
redis.auth=root

spring配置文件中添加

    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="minIdle" value="${redis.minIdle}"></property>
        <property name="maxTotal" value="${redis.MaxTotal}"></property>
    </bean>
    <bean id="jedisPool" class="redis.clients.jedis.JedisPool">
        <constructor-arg index="0" ref="poolConfig"></constructor-arg>
        <constructor-arg index="1" value="${redis.host}"></constructor-arg>
        <constructor-arg index="2" value="${redis.port}"></constructor-arg>
        <constructor-arg index="3" value="${redis.timeout}"></constructor-arg>
        <constructor-arg index="4" value="${redis.auth}"></constructor-arg>
    </bean>

其它:

在tomcat集群环境下,用户登录后服务端如何保存登录用户信息.

方案1:基于redis进行HttpSession对象的在多台tomcat服务器之间的共享,仍然使用HttpSession来存登录用户。

方案2:基于token机制,当用户首次登录服务器,由服务端生成加密token令牌返回客户端,以后客户端都携带token令牌进入服务器,服务器校验token合法性,解析token中登录用户标识,从redis中根据用户标识获取完整用户信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值