Redis入门

欢迎访问我的个人博客:www.ifueen.com

Redis入门

概述

🤣🤣🤣🤣🤣🤣🤣🤣🤣🤣

首先数据库分为关系型和非关系型的数据库

关系型:Mysql

非关系型:Redis

Redis是一个开源的,C语言进行编写的非关系型数据库,他将数据存储在内存中,对于数据的读取速度很快,处理高并发非常方便

Redis的优势

  • Redis采用键值对的方式进行数据的存储,解决了传统的关系型数据库对于高并发处理的缺陷,能够快速、完美地解决高并发问题

  • 它的数据保存在内存中,存取速度快

  • 支持的存储方式有很多类型,例如String、List、Set、ZSet和Hash

  • Redis支持集群

  • 支持持久化,可以把内存中的数据持久化到磁盘上面

  • 支持订阅和发布功能

Redis的使用场景

Redis的使用场景包括但不仅限于以下方面

中央缓存

作为计数器来使用

实时攻击防护(防暴力破解)

设置有效期

队列功能(秒杀)

消息订阅系统

Redis常用命令

对Key的常用操作

  • key *:获取所有的key
  • del key:删除key
  • expire key xx:设置key的过期时间(xx秒后过期)
  • ttl key:查看key的过期时间
  • flushall:清空整个redis服务器中的数据
  • flushdb:清空当前数据库中的所有数据(redis默认16个数据库)
  • select xx:选择xx数据库

String型

  • set key value:设置相应的key和value
  • get key:获取相关key的value值
  • mset:同时设置多对key和value
  • mget:同时获取多对key和value
  • incr key:将key中存储的数字值+1(注意:必须是数值型)
  • decr key:将key中存储的数字值+1(注意:必须是数值型)
  • incrby key:设置自增多少
  • decrby key:设置自减多少

List型

List集合是一个有序可重复的队列

  • lpush key value:将一个或多个值从左到右插入到list集合中
  • rpush key value:将一个或多个值从右到左插入到list集合中
  • lpop key:从左边开始移除key值
  • rpop key:从右边开始移除key值
  • lrange key start stop:返回指定长度的元素(lrange key 0 -1代表返回全部元素)
  • lrem key count value:根据count值移除列表key中于参数value相等的元素 (count>0:从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。count = 0 : 移除表中所有与 value 相等的值)
  • inedx key index:返回下标为index的元素
  • itrim key start stop:对一个列表进行截取,从start开始,stop结束

Set型

Set集合是一个无序不重复的队列,能够自动去重

  • sadd key member:将一个或多个member元素加入到set集合中,拥有自动去重功能
  • srem key member:移除集合中的一个或多个元素
  • smember key:返回集合key中的所有成员

🤣🤣🤣🤣🤣🤣🤣🤣🤣🤣🤣

Hash型

  • hset key name value:添加一个name和value键值对到key这个hash类型
  • hget key name:获取hash类型的name键对应的值
  • hmset 大key name1 小key name2 小key:添加多个name和key保存到大key中
  • hmget key name1 name2:批量获取hash类型的键对应的值
  • hkeys:返回哈希表 key 中的所有键
  • hvals:返回哈希表 key 中的所有的value值
  • hgetall:返回哈希表 key 中,所有的键和值

事务

在Redis中的事务是弱事务,失败并不会回滚,有点多余

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

订阅/广播

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

Java操作Redis

创建一个普通java项目

导包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ExBMHcU5-1574164199044)(images/M2hEWj.png)]

配置连接池

新封装一个工具类,方便以后获取Jedis

package com.ifueen.redis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * 连接连接池的工具类
 */
public class JedisUtil {

    private static JedisPool jedisPool = null;
    static {
        //创建JedisPool配置对象
        JedisPoolConfig config = new JedisPoolConfig();

        //配置
        config.setMaxIdle(2);
        config.setMaxTotal(10);
        config.setMaxWaitMillis(1*3000); //创建连接超时
        config.setTestOnBorrow(true);//获取连接是测试连接是否畅通

        //配置jedisPool
        jedisPool = new JedisPool(config,"127.0.0.1",6379,1*1000,"123456");
    }

    /**
     * 返回jedis对象
     * @return
     */
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }

    /**
     * 关闭连接池
     */
    public static void close(){
        jedisPool.destroy();
    }

}

测试

package com.ifueen.redis;

import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.SortingParams;
import redis.clients.jedis.Transaction;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 测试jedis
 */
public class JedisTest {
    //获取到jedis
    Jedis jedis = JedisUtil.getJedis();
    /**
     * 测试String型
     */
    @Test
    public void testString(){

        //设置单个String的健值
        jedis.set("name","fueen");
        String name = jedis.get("name");
        System.out.println(name);

        //给多个set赋值
        jedis.mset("username","fueen","age","18","speak","山泥若");
        List<String> mget = jedis.mget("username", "age", "speak");
        mget.forEach(m->{
            System.out.println(m);
        });

        //让key自增
        Long age = jedis.incr("age");
        System.out.println(age);
        //自减多少
        Long decrBy = jedis.decrBy("age", 5);
        System.out.println(decrBy);
        //关闭jedis
        jedis.close();
        JedisUtil.close();
    }

    /**
     * 对Key的测试
     */
    @Test
    public void testKey() throws Exception {

        //获取所有的key
        Set<String> keys = jedis.keys("*");
        System.out.println(keys);
        //删除key
        jedis.del("age1");
        Set<String> keys1 = jedis.keys("*");
        System.out.println(keys1);
        //设置key的过期时间
        jedis.expire("age",30);
        //查看key的过期时间
        Long age = jedis.ttl("age");
        System.out.println(age);
        //清空所有数据库的数据,直接清空整个redis
        jedis.flushAll();
        Set<String> keys2 = jedis.keys("*");
        System.out.println(keys2);
        //清空当前库
        jedis.flushDB();
        Set<String> keys3 = jedis.keys("*");
        System.out.println(keys3);
        //选择数据库
        jedis.select(5);
        jedis.close();
        JedisUtil.close();
    }

    /**
     * 对List集合的操作
     */
    @Test
    public void testList(){
        //从左到右将值插到list中去
        jedis.lpush("name","fueen","山泥若","电棍","落日飞车","李志");
        //查询list集合中的值
        List<String> name = jedis.lrange("name", 0, -1);
        System.out.println(name);
        //从右到左将值插到list中
        jedis.rpush("speak","希望我们大家开心","你没事吧?兄弟",
                "这打野的走位我就觉得你妈逼离谱","MyJnin","妈妈,他们抛弃了我");
        List<String> name1 = jedis.lrange("speak", 0, -1);
        System.out.println(name1);

        //移除并返回列表 key 的头(最左边)元素
        String name2 = jedis.lpop("name");
        System.out.println(name2);
        //移除并返回列表key的最右边元素
        String speak = jedis.rpop("speak");
        System.out.println(speak);
        List<String> name3 = jedis.lrange("name", 0, -1);
        System.out.println(name);
        List<String> name4 = jedis.lrange("speak", 0, -1);
        System.out.println(name4);
        //根据count值(第二个参数)移除列表key中与参数 value(第三个参数) 相等的元素
        jedis.lrem("name",0,"山泥若");
        List<String> name5 = jedis.lrange("name", 0, -1);
        System.out.println(name5);
        //对一个列表进行修剪
        jedis.ltrim("speak",0,2);
        //排序
        jedis.lpush("num","15","56","19","70");
        System.out.println("原始值:"+jedis.lrange("num",0,-1));
        System.out.println("排序后的值:"+jedis.sort("num"));
        jedis.close();
        JedisUtil.close();
    }

    /**
     * 对Set集合进行操作
     */
    @Test
    public void testSet(){
        //添加元素到set中
        jedis.sadd("person","fueen","李志","万青","痛仰","窦唯");
        //查看所有成员
        Set<String> person = jedis.smembers("person");
        System.out.println(person);
        //删除
        jedis.srem("person","痛仰");
        //查看所有成员
        Set<String> person1 = jedis.smembers("person");
        System.out.println(person1);
        //获得两个集合的交集
        jedis.sadd("persons","fueen","这个世界会好吗","秦皇岛","再见杰克","高级动物");
        Set<String> sinter = jedis.sinter("person", "persons");
        System.out.println(sinter);
        //将交集保存到一个新的集合中
        jedis.sinterstore("personts","person","persons");
        Set<String> person2 = jedis.smembers("personts");
        System.out.println(person2);
        //获取并集
        Set<String> sunion = jedis.sunion("person", "persons");
        System.out.println(sunion);
        //将并集保存到一个新的set中
        jedis.sunionstore("personc","person","persons");
        Set<String> person3 = jedis.smembers("personc");
        System.out.println(person3);
        //差集
        Set<String> sdiff = jedis.sdiff("person", "persons");
        System.out.println(sdiff);
        //将差集保存到新的set中
        jedis.sdiffstore("persont","person","persons");
        Set<String> person4 = jedis.smembers("personc");
        System.out.println(person4);
        jedis.close();
        JedisUtil.close();
    }

    /**
     * 对Hash的操作
     */
    @Test
    public void testHash(){
        //设置值
        jedis.hset("user",  "name","向阳花");
        //获取所有
        Map<String, String> user = jedis.hgetAll("user");
        System.out.println(user);
        //删除
        jedis.hdel("user","name");
        jedis.hset("ccc","age","15");
        //自增
        jedis.hincrBy("ccc","age",2);
        Map<String, String> ccc = jedis.hgetAll("ccc");
        System.out.println(ccc);
        //新增多个成员
        jedis.hmget("user",  "name","向阳花","age","20","speak","会不会害怕");
        //查询所有的key
        Set<String> user1 = jedis.hkeys("user");
        System.out.println(user1);
        //查询所有的value
        List<String> user2 = jedis.hvals("user");
        System.out.println(user2);
        jedis.close();
        JedisUtil.close();
    }

    /**
     * 测试排序
     */
    @Test
    public void testJedis(){
        jedis.lpush("num","15","56","19","70");
        System.out.println("原始值:"+jedis.lrange("num",0,-1));
        System.out.println("排序后的值:"+jedis.sort("num"));

        SortingParams sortingParams = new SortingParams();
        sortingParams.alpha();
        System.out.println("排序后:"+jedis.sort("langues",sortingParams));
        jedis.close();
        JedisUtil.close();
    }

    /**
     * 测试事务
     */
    @Test
    public void testTransation(){
        jedis.set("name","fueen");
        jedis.set("age","20");
        System.out.println(jedis.mget("name","age"));
        //开启事务
        Transaction multi = jedis.multi();
        //自增
        multi.incr("name");
        multi.incr("age");
        //提交事务
        List<Object> exec = multi.exec();
        System.out.println(exec);
        System.out.println(jedis.mget("name","age"));
        jedis.close();
        JedisUtil.close();
    }


}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值