Redis入门

1.Redis介绍

(1)Redis开源 高性能nosql数据库,数据可以存储在内存或磁盘上面
(2)Redis 主要key-value结构形式存储,redis底层支持各种类型的数据存储结构包括 list set map string等。

1.1 nosql的概念

NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,它泛指非关系型的数据库。随着互联网2003年之后web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的交友类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。

1.2 Redis优势

(1) 数据存储:存放在内存,还支持持久化.-存取速度快,并发能力强,数据安全性高
(2) 支持value类型
(3) 支持多个语言客户端
(4) 还支持集群(支持高并发,海量数据)

1.3 redis和memcache的区别

mysqlredismemcached
类型关系型非关系型非关系型
存储位置磁盘磁盘和内存内存
存储过期不支持支持支持
读写性能非常高非常高
存储的结构表来存储支持很多 list/set/array/string/map等普通键值对key-value

1.4 redis的使用场景

(1) 最多就是缓存

(2)计数器应用 – 微博 热点新闻 – 转载 点赞(高并发)

(3)实时防攻击系统 – 银行网站 (登录) --计数 (ip 同一个ip + 5)

​ redis–支持断电恢复 内存和磁盘

(4)有效期的应用 – 道具 红包 优惠券 …

(5)支持无序的场景 – set特效

(6)队列 -->quene -->秒杀 抢购

(7)消息系统订阅发布

2.使用redis

Redis 的官方下载站是 连接,可以去上面下载最新的安装程序下来连接

2.1 对字符串操作

set key value   //将字符串值value关联到key
get key         //返回key关联的字符串值
mset		    //同时设置一个或多个 key-value 对
mget 			//返回所有(一个或多个)给定 key 的值
incr key 	    //将 key 中储存的数字值增1(key不存在,则初始化为0,再加1)
decr key        //将 key 中储存的数字值减1(key不存在,则初始化为0,再减1)
incrBy key  	//自增多少
decrBy key

2.2 对key的操作

keys *  		  //获取所有key列表
del key 		  //删除key
expire key xx     //设置key的过期时间(xx秒后过期)
ttl key           //查看key的过期时间
flushall 		  //清空整个redis服务器数据,所有的数据库全部清空
flushdb  		  //清除当前库,redis中默认有16个数据库
select index --select 0

2.3 对list操作

list集合可以看成是一个左右排列的队列(列表)
lpush key value //将一个或多个值 value 插入到列表 key 的表头(最左边)
rpush key value //将一个或多个值 value 插入到列表 key 的表尾(最右边)
lpop key //移除并返回列表 key 的头(最左边)元素。
rpop key //移除并返回列表 key 的尾(最右边)元素。
lrange key start stop //对集合进行修剪
lrem key count value //根据count值移除列表key中与参数 value 相等的元素count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。count = 0 : 移除表中所有与 value 相等的值。
lindex key index //返回列表 key 中,下标为 index 的元素
ltrim key start stop //对一个列表进行修剪

2.4 set操作

sadd  key members  添加值
srem key member  删除值
smembers key  查看可以对应的值

2.5 hash操作

hset key name value  --设置key value
hget key name --通过key获取值
hmset key name1 key1 name2 key2 --批量设置
hmget key name1 name2 --批量获取
hkeys --获取所有的key
hvals --获取所有的value
hgetall --获取所有的key和value

2.6 事务操作

弱事务 : 日志
强事务 :同时成功 同时失败-- 金融数据
Redis的事务在执行exec指令时,才批量执行操作,没有回滚操作

multi  //标记一个事务块的开始。
exec   //执行所有事务块内的命令。
discard //取消事务,放弃执行事务块内的所有命令。

2.7 订阅发布

SUBSCRIBE channel [channel ...] //订阅给定的一个或多个频道的信息。
PUBLISH channel message //将信息 message 发送到指定的频道 channel 。

2.8 设置密码

  1. 通过命令动态调整密码
CONFIG SET 命令可以动态地调整 Redis 服务器的配置而无须重启,重启后失效
CONFIG SET requirepass 123456 //将密码设置为123456
CONFIG SET requirepass "" //清除密码
AUTH 123456  //输入密码进行认证
  1. 通过配置文件设置密码
在配置文件redis.widows.conf中增加一行代码
requirepass 123456
将密码123456设置到配置文件中,redis启动时加载该文件,即可启用密码

3.通过java操作redis

原来mysql需要使用jdbc,现在需要redis的一个java客户端jedis。
jedis是客户端,而reids是服务器。使用jedis这个java客户端操作redis数据库。

3.1 使用jedis 客户端,完成jedis简单操作

@Test
public void test()throws Exception{
    //创建连接
    String host ="127.0.0.1";
    int port = 6379;
    int timeout = 1000;//超时时间,1秒超时
    Jedis jedis = new Jedis(host,port,timeout);
    jedis.auth("admin");
    //执行操作
    jedis.set("yhptest","yhptest dbl!");
    System.out.println(jedis.get("yhptest"));
    //关闭连接
    jedis.close();
}

3.2 通过jedis连接池,简单操作redis数据库

@Test
public void test()throws Exception{
    //1 创建jedispool配置对象
    JedisPoolConfig config = new JedisPoolConfig();
    //2 做配置-四个
    config.setMaxIdle(2);
    config.setMaxTotal(10);
    config.setMaxWaitMillis(1*1000); //创建连接超时
    config.setTestOnBorrow(true);//获取连接是测试连接是否畅通
    //3 创建jedispool
    //1*1000 获取连接超时时间
    JedisPool pool = new JedisPool(config,
            "127.0.0.1",6379,1*1000,"admin");
    //4 通过jedispool获取连接
    Jedis jedis = pool.getResource();
    //5 执行操作
    jedis.set("jedispooltest","dbldblddzt.....");
    System.out.println(jedis.get("jedispooltest"));
    // 6 释放连接
    jedis.close(); //底层做了兼容,如果是连接池操作就是释放,如果是连接操作就是关闭
    // 7 摧毁连接池-如果是真正项目中它应该是一个受spring管理的单例
    pool.destroy();
}

3.3 对字符串操作

jedis.set("name", "张三"); //set
System.out.println(jedis.get("name")); //get  获取
System.out.println(jedis.keys("*")); //查看所有key
System.out.println(jedis.del("name")); //删除key
System.out.println(jedis.get("name")); //get //获取
System.out.println(jedis.set("name", "李四")); //修改
System.out.println(jedis.get("name")); //get

3.4 对集合操作List – 有顺序 可以重复

jedis.flushDB();//清空数据库
jedis.lpush("students", "蔡徐坤", "吴亦凡", "吴亦凡", "鹿晗", "范丞丞");
jedis.lrem("students", 0, "吴亦凡");
System.out.println(jedis.lrange("students", 0, -1));

3.5 Set操作 --无顺序 不重复

jedis.flushDB();
jedis.sadd("students", "蔡徐坤", "吴亦凡", "吴亦凡", "鹿晗", "范丞丞");
System.out.println(jedis.smembers("students"));

3.6 hash操作

jedis.hset("students3","student","zhangsan");
System.out.println(jedis.hget("students3", "student"));

3.7 Jedis排序

//对数字排序
jedis.flushDB();
jedis.lpush("nums","1","2","3","4","8","5","3","1");
System.out.println(jedis.sort("nums"));
SortingParams sortingParams1 = new SortingParams();
sortingParams1.desc();
System.out.println(jedis.sort("nums", sortingParams1));
//对字母排序
jedis.lpush("langues","java","php","c++","test","ui");
SortingParams sortingParams = new SortingParams();
sortingParams.alpha();
sortingParams.desc();
System.out.println(jedis.sort("langues",sortingParams));

3.8 事务 --弱事务

@Test
    public void testTransaction() throws Exception{
        JedisPoolConfig config = new JedisPoolConfig();
        //闲时最大连接数
        config.setMaxIdle(2);
        //最大连接数
        config.setMaxTotal(10);
        //最大等待时间
        config.setMaxWaitMillis(1000);
        JedisPool jedisPool = new JedisPool(config,"127.0.0.1", 6379, 1000*10,"123456");
        Jedis jedis = jedisPool.getResource();
        jedis.set("name","蔡徐坤");
        jedis.set("age","30");
        //开启事务
        Transaction transaction = jedis.multi();
        transaction.incr("name");
        transaction.incr("age");
        List<Object> list = transaction.exec();
        System.out.println(list);
        jedis.close();
        jedisPool.destroy();
    }

4.redis 持久化

有时候 我们的服务一旦关了,数据就会丢失,但是有时候 我们需要把数据存下来,所有在做持久化操作;持久(持久层 dao层 mapper层): 就把数据保存到磁盘 这个过程就叫持久化

4.1 rdb方式

RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照,默认开启该模式。
如何关闭 rdb 模式:

save ""
# save 900 1        //至少在900秒的时间段内至少有一次改变存储同步一次
# save 120 10       //在120秒内有10个数数据发生了变化就会储存
# save 1 10000      //在1秒内有10000个数据发生变化就储存一次

4.2 aof方式

AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集,默认关闭该模式。
如何开启aof模式:

appendonly yes         //yes 开启,no 关闭
# appendfsync always //每次有新命令时就执行一次fsync 
#这里我们启用 everysec
appendfsync everysec //每秒 fsync 一次
# appendfsync no      //从不fsync(交给操作系统来处理,可能很久才执行一次fsync)

5 redis的淘汰策略

淘汰一些数据,达到redis数据都是有效的。选择合适的淘汰策略进行淘汰。

5.1 lru:最近最少使用

volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

5.2 ttl:将要过期中淘汰

volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

5.3 random: 随机数据

volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

5.4 其他淘汰策略

allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据
redis 确定驱逐某个键值对后,会删除这个数据并,并将这个数据变更消息发布到本地(AOF 持久化)和从机(主从连接)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值