• redis


    第六章:Redis

    第1节:缓存简介

    1.1 什么是缓存
       		缓存就是数据存放在距离计算最近的位置以加快处理速度。缓存是改善软件性能的第一手段,缓存意在减少系统对数据库的过多访问,通过减少对数据库的访问次数,改用访问内存的方式,提升系统的性能。直接从内存获取数据,较之从数据库获取数据,效率可以得到显著的提升。
    
    • 1
    1.2 主流的缓存技术介绍
    主流缓存技术有RedisMemcached。二者谁的性能更高?单纯从缓存命中的角度来说,是Memcached要高,RedisMemcache的差距不大,底层存放数据都是key/value形式存在。但是,Redis提供的功能更加的强大。
    两者之间共同点: 
    (1)都是属于 nosql系列数据库。 not only sql  
    (2)memcached 和redis 底层都是key/value形式存放数据。 
    
    二者的区别是什么?
    1Memcache是多线程:   底层存放数据都是key/value形式: value类型:String 
    2Redis是单线程   :    底层存放数据 key/value value对应的数据类型可以有多种。   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1.3 redis的介绍
    RedisRemote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)list(链表)set(集合)zset(sorted set --有序集合)和hash(哈希类型)。
    
    
    总结: 
    redis  key/value数据库:  value 有五种数据类型。 
           和Memcached类似 。 
           支持多语言API: java c# ios php   
           C 语言开发: vmware 公司维护
           
      http://redis.cn/ 中文官网网站
      https://redis.io/ 英文网站
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    第2节:安装和操作

    		本章主要讲解redis的下载和按装过程,在授课时要有序引导分步聚讲解按装过程。重点体现redis的服务的启动方式(前台启动和后台启动)、redis的关闭与退出、密码设置、客户端连接redis的两种方式(本地连接和远程连接)
    • 1
    2.1 下载redis
    打开redis官网redis.io找到Download it选择对应的版本开始下载
    
    • 1

    在这里插入图片描述

    ​ redis版本

    在这里插入图片描述

    2.2 linux下安装redis
    下载的redis.tar.gz 是一个C语言的源码包。 通过源码编译,进行安装。  
    首先C语言的运行环境~  
    
    • 1
    • 2
    2.2.1 安装运行环境
    redis是c语言开发的安装redis需要c语言的编译环境,如果没有gcc需要在线安装。
    yum install gcc-c++
    
    • 1
    • 2
    2.2.2 上传并解压缩
    在opt目录下进行解压操作
    tar -zxvf redis-5.0.9.tar.gz 
    
    • 1
    • 2
    2.2.3 编译
    [root@localhost ujiuye]# cd redis-5.0.9
    [root@localhost redis-5.0.9]# make   #注意 编译动作redis目录当中进行
    
    • 1
    • 2
    2.2.4 安装redis
    mkdir /usr/local/ujiuye/redis #创建了一个安装目录
    make install PREFIX=/usr/local/ujiuye/redis #编译安装到指定的目录。 
    
    • 1
    • 2

    在这里插入图片描述

    /usr/local/ujiuye/redis/bin 当中 出现: 
        redis-benchmark 
    
        redis-check-aof  
    
        redis-check-rdb  
    
        redis-cli 
    
        redis-sentinel  
    
        redis-server
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    2.3 常用操作
    2.3.1 启动redis服务
    1. 前台启动
    进入到redis的bin目录下,键入 ./redis-server 
    特点: 前台启动, 会把当前窗口被占用,不能进行其他的操作。 不推荐使用该方式~ 
    
    • 1
    • 2

    在这里插入图片描述

    2. 后台启动
    从redis-5.0.5目录中找到redis.conf文件并拷贝到redis/bin目录下
    cp /usr/local/ujiuye/redis-5.0.5/redis.conf /usr/local/ujiuye/redis/bin
    
    修改redis.conf中的daemonize改为yes : 
    136行: daemonize yes
    
    根据配置文件启动: ./redis-server redis.conf
    
    启动成功: 
    ps -ef | grep redis 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    2.3.2 关闭/退出
    推荐使用: 客户端发出关机指令
    [root@localhost bin]# ./redis-cli shutdown
    
    
    暴力方式: 
    kill -9 pid 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    2.3.3 设置密码(了解)
    从redis-5.0.5目录中找到redis.conf文件并拷贝到redis/bin目录下
    cp /usr/local/ujiuye/redis-5.0.5/redis.conf /usr/local/ujiuye/redis/bin
    
    vim redis.conf 
    507 行: 
    requirepass 123456
    
    登录: 登录成功之后后, 操作redis,必须auth进行授权~ 
    auth 123456
    
    总结: 一般情况, redis在使用的时候不需要设置密码。 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    2.3.4 redis连接
    1. 本地连接
    键入./redis-cli 
    设置了密码: auth 123456  
    
    退出客户端: exit 
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    2. 远程连接
    防火墙: 
    systemctl stop firewalld.service   
    只针对当前开关机。 
    或者是在防火墙当中释放 6379端口号: 
    
    
    
    编辑: redis.conf 配置文件: 
    69 #bind 127.0.0.1    #69行注释
        添加 bind 0.0.0.0
    88 protected-mode no  #将受保护模式设置为no 
    保存并且退出: 
    
    
    重新启动redis服务器:
    然后输入 ./redis-cli -h 192.168.18.200 -p 6379
    
    【注意】: 修改完毕配置文件, 必须重新启动redis 。 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

    第3节:常用命令介绍【通用性指令】

    		本章主要介绍redis的常用指令,包括一些公共命令keys、existis、del、flushdb、flushall、type。重点介绍redis五种数据类型的中的常用命令和各种数据类型的应用场景。
    
    • 1
    3.1 keys命令
    用于显示当前库中匹配的key,如果为设置为*表示显示库中所有的key
    192.168.18.200:6379> keys * 
    
    • 1
    • 2
    3.2 exists
    测试指定的key是否存在,如果存在返回1,不存在返回0192.168.18.200:6379> exists name
    (integer) 1
    
    192.168.18.200:6379> exists address
    (integer) 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    3.3 del
    删除库中指定的key的信息
    192.168.18.200:6379> del name
    (integer) 1
    可以一次性删除多个key的信息,同时返回被删除的个数。
    192.168.18.200:6379> del name1 name2
    (integer) 2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    3.4 flushdb
    Flushdb 命令用于清空当前数据库中的所有 key,总是返回 OK。
    192.168.18.200:6379> flushdb
    OK
    
    • 1
    • 2
    • 3
    3.5 flushall
    Flushall 命令用于清空整个 Redis 服务器的数据(删除所有数据库的所有 key)。
    redis安装成功之后, 一共16个数据库: 0-15表示 
    切换数据库: select index 
    192.168.18.200:6379> flushall 
    OK
    
    注意: 企业当中禁用~ 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    3.6 type
    Type命令用于返回 key 所储存的值的类型。
    192.168.18.200:6379> type name
    string
    list
    set 等等~ 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    第4节:redis的数据类型

    4.1 Sring类型
    4.1.1 String类型介绍
    string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。
    string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
    string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。【了解】
    
    • 1
    • 2
    • 3
    4.1.2 String类型命令
    1. set
    设置key和value并保存到当前为中。
    语法:set key  value
    192.168.18.200:6379> set name zhangsan
    OK
    
    • 1
    • 2
    • 3
    • 4
    2. get
    获取指定key的值
    语法:get key
    192.168.18.200:6379> get name
    "zhangsan"
    
    如果指定的key 不存在, nil 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    3. append
    在原来的值的基础上追加新值,并返回总字符串的长度。
    语法:append key value
    192.168.18.200:6379> append name feng
    (integer) 12
    
    • 1
    • 2
    • 3
    • 4
    4. strlen
    获取指定key的值的长度
    语法:strlen  key
    192.168.18.200:6379> strlen name
    (integer) 12
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    5. getrange
    获取指定key的值,从start位置开始,end位置结束
    语法:getrange key  start  end
    192.168.18.200:6379> getrange name 2 7
    "angsan"
    
    • 1
    • 2
    • 3
    • 4
    6. setrange
    从起始位置替换值 , offset 是一个偏移量
    语法:setrange key offset value
    192.168.18.200:6379> setrange name 2 abc
    (integer) 12
    
    • 1
    • 2
    • 3
    • 4
    7. setex
    设置key的值并指定存活时间
    语法:setex key second  value
    192.168.18.200:6379> setex name2 100 lisi #当前name2只有100S存活时间
    OK
    
    ttl name2 #查询剩余时间
    
    -2:当前key已经过时。 
    -1:当前key 永远不过时
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    8. setnx
    nx; not exist 先去判断当前的key是否存在,如果存在,不执行。 只有当key 不存在的时候,执行 
    语法:setnx key value
    192.168.18.200:6379> setnx address beijing
    (integer) 1
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    9. incr
    对key的值自增1
    语法:incr key
    192.168.18.200:6379>incr currentPage 
    注意: 只有数值类型可以进行自增。 
    
    • 1
    • 2
    • 3
    • 4
    10. decr
    对key的值自减1
    语法:decr key
    192.168.18.200:6379>decr currentPage
    
    • 1
    • 2
    • 3
    11. incrby
    对key的值递增指定步长的值
    语法:incrby key  number
    192.168.18.200:6379>incrby currentPage 10
    
    • 1
    • 2
    • 3
    12. decrby
    对key的值递减指定步长的值
    语法:decrby key  number
    192.168.18.200:6379>decrby currentPage 5
    
    • 1
    • 2
    • 3
    13. mset
    一次性设置多个key-value键值对
    语法:mset key1 value1 key2 value2 ....
    192.168.18.200:6379>mset name1 zhangsan name2 lisi name3 wangwu
    
    • 1
    • 2
    • 3
    14. mget
    一次性获取多个key的值:more
    语法:mget key1 key2 ....
    192.168.18.200:6379>mget name1 name2
    
    • 1
    • 2
    • 3
    15. expire
    设置key的存活时间  seconds秒数
    语法:ttl key 
    192.168.18.200:6379>expire address 30
    
    
    • 1
    • 2
    • 3
    • 4
    16. ttl
    设置指定的key永久有效 
    语法: persist key 
    192.168.18.200:6379>ttl address
    
    注意: 
    -2 表明当前的key 失效
    -1 表明当前的key 永久有效 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    4.2 List类型
    4.2.1 List类型介绍
    Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
    
    总结: List集合特点: 存放的元素可以重复,并且有顺序~ 有下标。 
    List集合类型类似于java当中的链表。 
    主要操作的是链表的头部和尾部
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    4.2.2 List类型命令
    1. lpush
    向key集合的左边一次添加值
    语法:lpush key value1 value2.... 
    192.168.18.200:6379>lpush ages 22 34 21 45 20
    
    • 1
    • 2
    • 3
    2. rpush
    向key集合的右边一次添加值
    语法:rpush key value1 value2....
    192.168.18.200:6379>192.168.18.200:6379>rpush names zhangsan lisi wangwu zhaoliu zhangsan
    
    
    • 1
    • 2
    • 3
    • 4
    3. lrange
    取key集合中指定的start位置到stop位置的内容(-1代表集合结束)
    语法:lrange key start stop
    192.168.18.200:6379>lrange ages 0 2  查询前三个元素
    192.168.18.200:6379>lrange ages 0 -1  查询所有
    192.168.18.200:6379>lrange ages 0 -1  不查询最后一个元素
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    4. llen
    查看key集合的长度
    语法:llen   key
    192.168.18.200:6379>llen ages
    
    
    • 1
    • 2
    • 3
    • 4
    5. lpop
    删除key集合的第一个元素
    语法:lpop   key
    192.168.18.200:6379>lpop  ages
    
    
    • 1
    • 2
    • 3
    • 4
    6. rpop
    删除key集合的最后一个元素
    语法:rpop   key
    192.168.18.200:6379>rpop   ages
    
    
    • 1
    • 2
    • 3
    • 4
    7. lindex
    获取key集合的index索引的元素
    语法:lindex  key  index
    lindex   ages  2
    
    
    • 1
    • 2
    • 3
    • 4
    8. lrem
    删除key集合的count个索引的元素(集合中有重复值)  
    语法:lrem key count value
    192.168.18.200:6379>lrem ages 2  45
    
    
    • 1
    • 2
    • 3
    • 4
    4.3 Hash类型(散列)
    4.3.1 Hash类型介绍
    Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
    特点: 
    key 对应的值还是一个map类型: 
    
    key:   value: field value1
    user: {"username":"lisi","age":"21"}
    key :  {"field1":"value1","field2":"value2"}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    4.3.2 Hash类型命令
    1. hset
    设置key的field字段的值
    语法:hset key  field  value
    192.168.18.200:6379>hset person name lisi
    192.168.18.200:6379>hset person address changsha
    192.168.18.200:6379>hset person birthday 1997-10-10
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    2. hget
    获取key的field字段的值
    语法:hget key field
    192.168.18.200:6379>hget person name
    
    
    • 1
    • 2
    • 3
    • 4
    3. hmset
    一次设置key的多个字段的值
    语法:hmset key field1 value1  field2 value2 ....
    192.168.18.200:6379>hmset student name wagnwu age 22 gender man
    
    
    • 1
    • 2
    • 3
    • 4
    4. hmget
    一次获取key的多个字段的值
    语法:hmget key  field1 field2 ....
    192.168.18.200:6379>hmget student name age gender
    
    
    • 1
    • 2
    • 3
    • 4
    5. hgetall
    获取key的多个字段的值(包括键和值)
    语法:hgetall key  
    192.168.18.200:6379>hgetall student
    
    
    • 1
    • 2
    • 3
    • 4
    6. hkeys
    获取key的所有字段
    语法:hkeys key  
    192.168.18.200:6379>hkeys student
    
    
    • 1
    • 2
    • 3
    • 4
    7. hvals
    获取key的所有字段的值
    语法:hvals key  
    192.168.18.200:6379>hvals student
    
    
    • 1
    • 2
    • 3
    • 4
    8. hdel
    删除大key小中指定的多个小key的值
    语法:hdel key field1 field2 ... 
    192.168.18.200:6379> hdel student name gender age
    
    
    • 1
    • 2
    • 3
    • 4
    9. hlen
    返回key的所有键值对的个数
    语法: hlen key
    192.168.18.200:6379>hlen student
    
    
    • 1
    • 2
    • 3
    • 4
    10. hexists
    返回key的field字段是否存在
    语法:hexists key field 
    192.168.18.200:6379>hexists student name
    
    返回值: 
    1 :代表存在
    0 :代表不存在
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    4.4 Set类型
    4.4.1 Set类型介绍
    RedisSetString 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
    Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。集合中最大的成员数为 232  - 1 (4294967295, 每个集合可存储40多亿个成员)
    • 1
    • 2
    4.4.2 Set类型命令
    set集合特点: 
    元素可以多个,多个元素不能重复。  set集合无序 ~ 
    
    
    • 1
    • 2
    • 3
    1. sadd命令
    向为key的集合中添加多个值(去重)
    语法:sadd  key  value1 value2 ...
    192.168.18.200:6379>sadd empNames zhangsan lisi wangwu zhaoliu lisi
    
    
    • 1
    • 2
    • 3
    • 4
    2. smembers
    循环key集合中的所有值
    语法:members   key
    192.168.18.200:6379>smembers empNames
    
    
    • 1
    • 2
    • 3
    • 4
    3. scard
    统计key集合中的元素个数 
    语法:scard   key 
    192.168.18.200:6379> scard empNames
    
    
    • 1
    • 2
    • 3
    • 4
    4. srem
    删除key集合中的value值 
    语法:srem    key   value 
    192.168.18.200:6379>srem empNames  lisi
    
    
    • 1
    • 2
    • 3
    • 4
    5. spop
    随机删除key集合中的某个值 
    语法:spop    key 
    192.168.18.200:6379>spop empNames
    
    
    • 1
    • 2
    • 3
    • 4
    6. smove
    将集合中的某个值赋给另外一个集合: SMOVE 源集合  目的集合  值 
    语法:smove source destination member
    192.168.18.200:6379>smove empNames works zhangsan
    
    
    • 1
    • 2
    • 3
    • 4
    7. Sdiff
    求差集  
    语法:Sdiff   集合1  集合2 
    192.168.18.200:6379>sadd seta a b c d e
    192.168.18.200:6379> sadd setb c d e f g
    192.168.18.200:6379>sdiff seta setb
    1) "a"
    2) "b"
    sdiff setb seta
    1) "f"
    2) "g"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    8. sinter
    求交集
    语法:sinter  集合1  集合2 
    192.168.18.200:6379>sinter seta setb
    1) "d"
    2) "c"
    3) "e"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    9. sunion
    求并集
    语法:sunion  集合1  集合2 
    192.168.18.200:6379>
    sunion seta setb
    1) "d"
    2) "a"
    3) "b"
    4) "c"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    4.5 sortedSet类型
    4.5.1 sortedSet类型介绍
    		Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)
    • 1
    • 2
    4.5.2 sortedSet类型命令
    sortedSet 具有set集合的特点, 又给元素添加了顺序。 【根据分数排序】
    
    • 1
    1. zadd
    向为key的集合中添加多个(score-value)。
    语法:zadd  key   score value ...
    192.168.18.200:6379>zadd students 1 zhangsan 3 lisi 2 wangwu 5 zhaoliu
    
    
    • 1
    • 2
    • 3
    • 4
    2. zrange
    循环key的集合从start位到stop位置的值。
    语法:zrange key start stop [WITHSCORES]
    192.168.18.200:6379>zrange students 0 -1
    1) "zhangsan"
    2) "wangwu"
    3) "lisi"
    4) "zhaoliu" 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    3. zrem
    删除key集合中指定的value元素。
    语法:zrem key value
    192.168.18.200:6379>zrem students lisi
    
    
    • 1
    • 2
    • 3
    • 4
    4. zrevrange: reverse 翻转~
    逆序显示key集合中的元素。
    语法:zrevrange key start stop   [WITHSCORES]
    192.168.18.200:6379>zrevrange students 0 -1
    192.168.18.200:6379>zrevrange students 0 -1 withscores
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    5. zrangebyscore
    根据分数区间查询内容
    语法:zrangebyscore key min max 
    192.168.18.200:6379>zrangebyscore students 2 5 
    
    withscores 带有分数查询
    limit offset count 
    offset: 偏移量
    count:查询元素的个数
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    6. zcard
    统计key集合中有多少个键值对
    语法:zcard key  
    192.168.18.200:6379> zcard students
    
    
    • 1
    • 2
    • 3
    • 4
    7. zcount
    统计key集合中min到max区间元素。
    语法:zcount key min max 
    zcount students 10  50 
    根据与分数统计区间的元素个数。
    
    • 1
    • 2
    • 3
    • 4
    8. zrank
    统计key集合中指定元素索引。
    语法:zrank students wangwu     
    192.168.18.200:6379>zrank students wangwu 
    
    
    • 1
    • 2
    • 3
    • 4
    9. zscore
    统计key集合中指定元素的分数
    语法:zscore key value
    192.168.18.200:6379>zscore students zhangsan 
    
    
    • 1
    • 2
    • 3
    • 4

    第5节:java操作redis

    5.1 单实例方式
    5.1.1 添加依赖
    jedis java redis
    <dependency>
    <groupId>redis.clientsgroupId>
    <artifactId>jedisartifactId>
    <version>2.9.0version>
    dependency>
    <dependency>
    <groupId>junitgroupId>
    <artifactId>junitartifactId>
    <version>4.12version>
    <scope>testscope>
    dependency>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    5.1.2 创建Jedis连接对象
    Jedis jedis=new Jedis("192.168.18.200",6379);
    
    • 1
    5.1.3 操作redis数据库
    @Test
    	public void testJedis() {
    		Jedis jedis=new Jedis("192.168.18.131",6379);
    		jedis.set("birthday", "1991-10-30");
    		jedis.set("address", "beijing");
    		String address=jedis.get("address");
    		String birthday=jedis.get("birthday");
    		System.out.println("address:"+address);
    		System.out.println("birthday:"+birthday);
    		jedis.close();
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    5.2 连接池方式
    5.2.1 添加依赖
    <dependency>
     <groupId>redis.clientsgroupId>
     <artifactId>jedisartifactId>
     <version>2.9.0version>
    dependency>
    <dependency>
     <groupId>junitgroupId>
     <artifactId>junitartifactId>
     <version>4.12version>
     <scope>testscope>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    5.2.2 构建连接池对象
    //创建JedisPoolConfig对象
    JedisPoolConfig poolConfig=new JedisPoolConfig();
    //最大空闲连接数
    poolConfig.setMaxIdle(3);
    //大连接数
    poolConfig.setMaxTotal(5);
    //连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
    poolConfig.setBlockWhenExhausted(true);
    //获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常
    poolConfig.setMaxWaitMillis(30000);
    //在获取连接的时候检查有效性
    poolConfig.setTestOnBorrow(true);
    JedisPool jedisPool=new JedisPool(poolConfig,"192.168.18.200",6379,30000,"123456");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    5.2.3 操作redis数据库
    Jedis jedis=jedisPool.getResource();
    jedis.set("name", "wangxiaobing");
    jedis.set("age", "22");
    String name=jedis.get("name");
    String age=jedis.get("age");
    System.out.println("name:"+name);
    System.out.println("age:"+age);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    5.3 操作Java对象
    5.3.1 添加依赖
    <dependency>
     <groupId>redis.clientsgroupId>
     <artifactId>jedisartifactId>
     <version>2.9.0version>
    dependency>
    <dependency>
     <groupId>junitgroupId>
     <artifactId>junitartifactId>
     <version>4.12version>
     <scope>testscope>
    dependency>
    <dependency>
     <groupId>com.fasterxml.jackson.coregroupId>
     <artifactId>jackson-databindartifactId>
     <version>2.8.8version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    5.3.2 构建Person类型
    public class Person implements Serializable{
    	private int id;
    	private String name;
    	private String gender;
    	private int age;
    	
    	public Person() {}
    	public Person(int id, String name, String gender, int age) {
    		super();
    		this.id = id;
    		this.name = name;
    		this.gender = gender;
    		this.age = age;
    	}
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getGender() {
    		return gender;
    	}
    	public void setGender(String gender) {
    		this.gender = gender;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	@Override
    	public String toString() {
    		return "Person [id=" + id + ", name=" + name + ", gender=" + gender + ", age=" + age + "]";
    	}
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    5.3.3 redis存储Person对象
    一般情况下我们不会存储Java对象,因为在redis中对于对象都会把对象变成一个JSON格式的字符串,然后进行存储,这样简单明了,数据格式好,容易阅读,相比二进制数据会更小,更方便。
    工具类:
    public class JsonUtils {
    
    // 定义jackson对象
    private static final ObjectMapper MAPPER = new ObjectMapper();
    
    /**
         * 将对象转换成json字符串。
         * 

    Title: entityToJson

    *

    Description:

    * @param data * @return */
    public static String objectToJson(Object data) { try { String string = MAPPER.writeValueAsString(data); return string; } catch (JsonProcessingException e) { e.printStackTrace(); } return null; } /** * 将json结果集转化为对象 * * @param jsonData json数据 * @param clazz 对象中的object类型 * @return */ public static <T> T jsonToEntity(String jsonData, Class<T> beanType) { try { T t = MAPPER.readValue(jsonData, beanType); return t; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 将json数据转换成entity对象list *

    Title: jsonToList

    *

    Description:

    * @param jsonData * @param beanType * @return */
    public static <T>List<T> jsonToList(String jsonData, Class<T> beanType) { JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType); try { List<T> list = MAPPER.readValue(jsonData, javaType); return list; } catch (Exception e) { e.printStackTrace(); } return null; } } @Test public void testAddPerson(){ //创建JedisPoolConfig对象 JedisPoolConfig poolConfig=new JedisPoolConfig(); //最大空闲连接数 poolConfig.setMaxIdle(3); //大连接数 poolConfig.setMaxTotal(5); //连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true poolConfig.setBlockWhenExhausted(true); //获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常 poolConfig.setMaxWaitMillis(30000); //在获取连接的时候检查有效性 poolConfig.setTestOnBorrow(true); JedisPool jedisPool=new JedisPool(poolConfig,"192.168.18.200",6379,30000,"123456"); Person person=new Person(100,"张三","男",22,new Date()); Jedis jedis = jedisPool.getResource(); // jedis.set("person", JsonUtils.objectToJson(person)); jedis.hset("persons",person.getName(),JsonUtils.objectToJson(person)); jedis.close(); } @Test public void testAddPerson2(){ //创建JedisPoolConfig对象 JedisPoolConfig poolConfig=new JedisPoolConfig(); //最大空闲连接数 poolConfig.setMaxIdle(3); //大连接数 poolConfig.setMaxTotal(5); //连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true poolConfig.setBlockWhenExhausted(true); //获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常 poolConfig.setMaxWaitMillis(30000); //在获取连接的时候检查有效性 poolConfig.setTestOnBorrow(true); JedisPool jedisPool=new JedisPool(poolConfig,"192.168.18.200",6379,30000,"123456"); Jedis jedis = jedisPool.getResource(); String jsonData=jedis.get("person"); Person person=JsonUtils.jsonToEntity(jsonData,Person.class); System.out.println(person); jedis.close(); } 提供fastjson 解析器工具类: package com.offcn.utils; import com.alibaba.fastjson.JSON; public class JsonUtils { /** * 对象转换成字符串 * @param obj 任意对象 * @return String json格式的字符串 */ public static String Obj2JsonString(Object obj){ String jsonString = JSON.toJSONString(obj); return jsonString; } /** * * @param jsonString json格式字符串 * @param clz 传递类型 * @param * @return 返回值T ,任意类型 */ public static <T> T JsonString2Obj(String jsonString,Class<T> clz){ T t = JSON.parseObject(jsonString, clz); return t; } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142

    第6节:spring整合redis

    在开发中一般使用spring来管理redis,具体讲解spring整合redis的整合步聚。
    
    • 1
    6.1 整合思路分析
    spring和redis的整合,其它就是把redis的实例化过程交给spring容器来实例化,现在我们创建Jedis对象是通过JedisPool获取的,而创建JedisPool就必须实体化JedisPoolConfig对象,所以我们把JedisPoolConfigJedisPool都交给spring容管理,我们只从容器取获取JedisPool对象进行注入即可。
    
    • 1
    6.2 添加依赖
     <dependencies>
               <dependency>
                   <groupId>org.springframeworkgroupId>
                   <artifactId>spring-contextartifactId>
                   <version>5.2.5.RELEASEversion>
               dependency>
       
               <dependency>
                   <groupId>org.springframeworkgroupId>
                   <artifactId>spring-webmvcartifactId>
                   <version>5.2.5.RELEASEversion>
               dependency>
       
       
               <dependency>
                   <groupId>redis.clientsgroupId>
                   <artifactId>jedisartifactId>
                   <version>2.9.0version>
               dependency>
               
               <dependency>
                   <groupId>com.fasterxml.jackson.coregroupId>
                   <artifactId>jackson-databindartifactId>
                   <version>2.8.8version>
               dependency>
       
               <dependency>
                   <groupId>org.springframeworkgroupId>
                   <artifactId>spring-testartifactId>
                   <version>5.2.5.RELEASEversion>
               dependency>
               <dependency>
                   <groupId>junitgroupId>
                   <artifactId>junitartifactId>
                   <version>4.12version>
                   <scope>testscope>
               dependency>
           dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    6.3 配置spring整合redis
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> 
     
     <property name="maxIdle" value="3" /> 
     
     <property name="maxTotal" value="5" /> 
     
     <property name="blockWhenExhausted" value="true" /> 
     
     <property name="maxWaitMillis" value="30000" /> 
     
     <property name="testOnBorrow" value="true" />  
    	    bean> 
    
    <bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="close">
     <constructor-arg name="poolConfig" ref="jedisPoolConfig">constructor-arg>
     <constructor-arg name="host" value="192.168.18.131" />
     <constructor-arg name="port" value="6379" />	
     <constructor-arg name="timeout" value="30000" />
     <constructor-arg name="password" value="123456">constructor-arg>
    bean>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    6.4 编写测试代码
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:applicationContext.xml")
    public class JedisTest {
    
     @Autowired
     private JedisPool jedisPool;
    
     @Test
     public void testAddPerson(){
         Person person=new Person(100,"张三","男",22,new Date());
         Jedis jedis = jedisPool.getResource();
        // jedis.set("person", JsonUtils.objectToJson(person));
         jedis.hset("persons",person.getName(),JsonUtils.objectToJson(person));
         jedis.close();
     }
    
     @Test
     public void testAddPerson2(){
    
         Jedis jedis = jedisPool.getResource();
         String jsonData=jedis.get("person");
         Person person=JsonUtils.jsonToEntity(jsonData,Person.class);
         System.out.println(person);
         jedis.close();
     }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    redis: 重要~  redis 基础~   
    
    底层原理: 过期key 删除策略 ,  key 淘汰策略
    
    集群:  哨兵   
    
    基础好的自行扩展~ 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    6.5 redis 的持久化
    redis: 内存当中存放~ 
    
    持久化(序列化): redis将内存当中的数据持久化到外部的文件。 
    反序列化:  将外部文件的二进制数据 读取到内存 : 
    
    
    redis持久化方式: 
    rdb: 默认方式~   无需配置, 默认开启~   
    原理: 底层是基于快照 , 生成一个dump.rdb 文件 
    
    rdb方式的优点和弊端: 
    优点:  rdb文件的备份和恢复简单    
           性能最大化
           rdb对于灾难性恢复比较好的选择:
    弊端:  部分数据的丢失 
    
    
    aof: 
          原理:  通过记录日志文件的形式。 set name lisi   记录到日志文件
          优点:  更高的数据安全性,即数据持久性  文件过大,rewrite机制重写
          特点:  aof默认不支持, 如果需要使用 进行配置。 redis.confg aof
          弊端:  aof 效率不如rdb,  aof的日志文件过大。 
    
    实际生产: rdb + aof 两个模式混合使用~ 取优点~ 
    
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    4. Go的流程控制
    Cpolar+Tipas:在Ubuntu上搭建私人问答网站,为您提供专业的问题解答
    Linux 网络操作命令FTP
    在centos上安装Anaconda
    神经网络如何识别图像,神经网络图像识别技术
    B2B独立站怎样将客户转化为订阅会员
    iptables-ipset仅允许国内访问
    【前端实例代码】Html5+css3+JavaScript实现新拟态新拟物风格(Neumorphism)气泡图标泡泡网页效果!手把手教学!新手必会!超简单 ~
    jsbridge实战2:Swift和h5的jsbridge通信
    软件测试简历项目经验怎么写,没有项目经验?
  • 原文地址:https://blog.csdn.net/sjxxxx_/article/details/127755997