zoukankan      html  css  js  c++  java
  • 学习笔记--Redis

    Redis

    NoSQL概述

    什么是NoSQL

    • NoSQL = Not Only SQL
    • 非关系型的数据库

    为什么需要NoSQL

    • High performance 高并发读写
    • Huge Storage 海量数据的高效率存储和访问
    • High Scalability && High Availability 高可扩展性和高可用性

    NoSQL数据库的四大分类

    • 键值存储
    • 列存储
    • 文档存储
    • 图形存储

    NoSQL特点

    • 易扩展
    • 灵活的数据模型
    • 大数据量,高性能
    • 高可用

    Redis概述

    高性能键值对数据库,支持的键值数据类型

    • 字符串类型
    • 散列类型
    • 列表类型
    • 集合类型
    • 有序集合类型

    Redis应用场景

    • 缓存
    • 任务队列
    • 应用排行榜
    • 网站访问统计
    • 数据过期处理
    • 分布式集群架构中的session分离

    Redis安装

    linux下安装redis

    • 安装gcc-c++
    • make
    • make PREFIX=/home/programs/redis install
    • 复制redis.conf
    • 修改redis.conf
    • 启动./bin/redis-server ./redis.conf
    • 关闭 ./bin/redis-cli shutdown

    Jedis

    简单示例

    依赖

            <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>2.7.0</version>
            </dependency>
    

    示例

    /**
    * Jedis的测试
    * Created by qy_lu on 2018/1/7.
    */
    public class JedisTest1 {
    
        private static final String HOST = "192.168.31.100";
        private static final int PORT = 6379;
    
        /**
        * 单实例的测试
        */
        @Test
        public void test1() {
            // 1.设置IP地址和端口
            Jedis jedis = new Jedis(HOST, PORT);
            // 2.保存数据
            jedis.set("name", "imooc");
            // 3.获取数据
            String value = jedis.get("name");
            System.out.println(value);
            // 4.释放资源
            jedis.close();
        }
    
    
        @Test
        /**
        * 使用连接池
        */
        public void test2() {
            // 获得连接池的配置对象
            JedisPoolConfig config = new JedisPoolConfig();
            // 设置最大连接数
            config.setMaxTotal(30);
            // 设置最大空闲连接数
            config.setMaxIdle(10);
    
            // 获得连接池
            JedisPool jedisPool = new JedisPool(config, HOST, PORT);
            // 获得核心对象
            Jedis jedis = null;
            try {
                // 通过连接池获得连接
                jedis = jedisPool.getResource();
                // 设置数据
                jedis.set("name", "zhangsan");
                // 获取数据
                String value = jedis.get("name");
                System.out.println(value);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                // 释放资源
    
                if (jedis != null) {
                    jedis.close();
                }
                if (jedisPool != null) {
                    jedisPool.close();
                }
            }
        }
    }
    

    Redis的数据结构

    key

    • 不要太长
    • 不要太短
    • 统一的命名规范

    存储String

    赋值

    set company imooc      
    get company
    getset company baidu   //取company的值并将company的值设为baidu
    del company
    incr person   //将person递增1,空为0再递增
    decr person  //将person递减1
    incrby num 5  //将num加5
    decrby num 5   //将num减5
    append num 5  //在num末尾追加字符5
    

    存储Hash

    hset myhash username jack
    hset myhash age 18
    hmset myhash2 username rose age 21
    hget myhash username
    hmget myhash username age
    hgetall myhash
    hdel myhash username
    del myhash
    hincrby myhash age 5  //myhash中的age的值增加5
    hexists myhash username  //myhash中是否存在username
    hlen myhash  //获取myhash中key的数量
    hkeys myhash  //获取myhash中所有的key
    hvals myhash  //获取myhash中所有的val
    

    存储list

    lpush mylist a b c        //从左边压入元素
    rpush mylist2 a b c    //从右边压入元素
    lrange mylist 0 5       //列出索引位置在0(start)和5(end)之间的元素
    lrange mylist 0 -1     //也可以用-1表示从末端算起第几位
    lpop mylist     //从左边弹出一个元素
    rpop mylist   //从右边弹出一个元素
    llen mylist   //获取列表的元素数量
    lpushx mylist x    //将元素插入到列表的头部,若mylist不存在则不插入
    lrem mylist 2 3     //从前往后删除2个3
    lrem mylist -2 3     //从后往前删除2个3
    lrem mylist 0 3     //删除列表里所有的3
    lset mylist 3 x   //将索引为3的位置的值设置为x
    linsert mylist before b 11   //在第一个b之前插入11
    linsert mylist after b 22  //在第一个b之后插入22
    rpoplpush mylist1 mylist2   //将mylist1的最右边元素弹出并压入mylist2的最左边
    

    存储set

    sadd myset a b c  //增加
    srem myset a b  //删除
    smembers myset   //查看所有
    sismember myset a   //a是否存在myset中
    sdiff mya1 myb1    //mya1和myb1的差集,mya1中有的,myb1中没有的元素
    sinter mya1 myb1  //求交集
    sunion mya1 myb1  //求并集
    scard myset   //集合中元素数量
    srandmember myset  //随机返回一个元素
    sdiffstore  my1 mya1 myb1   //将mya1和myb1的差集存到my1
    sinterstore my1 mya1 myb1   //将mya1和myb1的交集存到my1
    sunionstore my1 mya1 myb1   //将mya1和myb1的并集存到my1
    

    存储Sorted-set

    zadd mysort 70 zs 80 ls 90 ww    //增加给定评分的值
    zadd mysort 100 zs   //新的评分会覆盖旧的
    zscore mysort zs   //获得zs的分数
    zrem mysort ls ww    //删除元素
    zcard mysort   //元素数量
    zrange mysort 0 -1     //列出元素
    zrange mysort 0 -1 withscores   //列出元素并带分数
    zrevrange mysort 0 -1 withscores    //按分数从大到小列出元素
    zremrangebyrank mysort 0 4  //删除范围内的元素
    zremrangebyscore mysort 80 100   //按分数范围删除元素
    zrangebyscore mysort 0 100  //列出分数范围内的元素
    zrangebyscore mysort 0 100 withscores    //列出分数范围内的元素并带分数
    zrangebyscore mysort 0 100 withscores limit 0 2     //列出分数范围内的前n个元素并带分数
    zincrby mysort 3 ls   //给ls的分数增加3
    zcount mysort 80 100   //分数范围内的元素数量
    

    keys通用操作

    keys *
    keys my?
    del my1 my2 my3
    exists my1
    exists mya1
    rename key1 key2
    expire key1 1000   //设置过期时间
    ttl key1  //剩余时间
    type key1  //key1的类型
    

    Redis特性

    多数据库

    0 - 15数据库实例

    select 0  //使用0号数据库
    select 1
    move myset 1   //将myset移动到1号数据库
    

    事务

    multi    //开启事务
    exec     //命令被原子化执行
    discard     //回滚
    

    Redis持久化

    • RDB持久化
    • AOF持久化
    • 无持久化
    • 同时使用RDB和AOF持久化

    RDB持久化

    默认使用RDB
    将内存快照定时写到硬盘
    只有一个文件
    redis.conf配置

    AOF持久化

    记录操作日志
    redis.conf配置

    Spring Data Redis

    Maven配置

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.qyluo.redis</groupId>
        <artifactId>redis-demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <name>redis-demo</name>
        <description>Demo project for Spring Boot</description>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.9.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
            <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
            <dependency>
                <groupId>com.google.code.gson</groupId>
                <artifactId>gson</artifactId>
                <version>2.8.0</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-configuration-processor</artifactId>
                <optional>true</optional>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    
    </project>
    
    
  • 相关阅读:
    Java动态代理(三)——模拟AOP实现
    Java动态代理(二)CGLIB动态代理应用
    Java动态代理(一)动态类Proxy的使用
    CGLIB实现动态代理
    初识Java微信公众号开发
    spring+ibatis事务管理配置
    什么是事务的传播特性
    Spring事务配置的五种方式
    Java语言基础(五) Java原始数据类型的分类以及数据范围
    Java语言基础(四) String和StringBuffer的区别
  • 原文地址:https://www.cnblogs.com/kioluo/p/8824756.html
Copyright © 2011-2022 走看看