Redis-使用篇

一、Redis操作-linux

①、key键

关键字(格式)含义实例
keys pattern查看当前库中所有的key (数据库内)。keys *
scan查看当前库中所有的key(数据库外) 。redis-cli --scan
exists key判断某个key是否存在,返回1表示存在,0不存在。exists k1
type key查看当前key 所储存的值的类型。type k1
del key删除已存在的key,不存在的 key 会被忽略。del k1
expire key time给key设置time秒的过期时间。1:成功;0:不存在。expire k1 10
ttl key返回剩余过期时间(秒)。-2:不存;-1:没有设置过期时间 。ttl k1
persist key移除过期时间,使得 key 永不过期。1:移除成功。persist key
  1. keys

查看当前库中所有的key 。

通配符含义示例
*通配任意多个字符keys *
?通配单个字符keys ?k
[]通配括号内的某1个字符
# 格式
keys 通配符

# 示例
keys *

注意:

生产已经禁止。因为长时间阻塞redis而导致其他客户端的命令请求一直处于阻塞状态。 更安全的做法是采用scan。

redis-cli --scan
"u*"
"user1"
"user"
  1. exists

判断某个key是否存在,返回1表示存在,0不存在。

# 格式
exists key

# 示例
exists k1
  1. type

查看当前key 所储存的值的类型。返回当前key所储存的值的类型,如string 、list等。

# 格式
type key

# 示例
type k1
  1. del

删除已存在的key,不存在的 key 会被忽略。可以设置多个key,返回删除成功的个数

# 格式
del key

# 示例
del k1 k2 k3
  1. expire

给key设置time秒的过期时间。设置成功返回 1 。 当 key 不存在返回 0。

# 格式
expire key time

# 示例
expire k1 10
  1. ttl

以秒为单位返回 key 的剩余过期时间。当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单位,返回 key 的剩余生存时间。

# 格式
ttl key

# 示例
ttl k1
  1. persist

移除给定 key 的过期时间,使得 key 永不过期。当过期时间移除成功时,返回 1 。 如果 key 不存在或 key 没有设置过期时间,返回 0 。

# 格式
persist key

# 示例
persist key
  • 示例
persist k1

②、String

String是Redis最基本的类型,一个key对应一个value。String是二进制安全的,意味着String可以包含任何数据,比如序列化对象或者一张图片。String最多可以放512M的数据。value 除了是字符串以外还可以是数字。

使用场景

  1. 计数器
  2. 统计多单位的数量
  3. 粉丝数
  4. 对象缓存存储
  5. 分布式锁
字符串设置操作
关键字含义示例
set设置给定 key 的值。可重写旧值,且无视类型。set k1 12
get用于获取指定 key 的值。如果 key 不存在,返回 nil 。get k1
append将给定的value追加到key原值末尾。append k1 str
setnx只有在key不存在时设置key的值。setnx k2 22
getrange 获取 \textcolor{red}{获取} 获取指定区间范围内的值,类似between…and 的关系getrange k1 2 -1
setrange 替换 \textcolor{red}{替换} 替换指定区间范围内的值,类似between…and 的关系setrange k1 2 test
mset同时设置一个或多个 key-value 。mset k3 test1 k4 test2
getset先get然后立即set。getset k1 java
  1. set

用于设置给定 key 的值。如果 key 已经存储其他值, set 就重写旧值,且无视类型。

# 格式
set key value

# 示例
set k1 12
  1. get

用于获取指定 key 的值。如果 key 不存在,返回 nil 。

# 格式
get key

# 示例
get k1
  1. append

将给定的value追加到key原值末尾。

# 格式
append key value

# 示例
append k1 str
  1. setnx

只有在key不存在时设置key的值

# 格式
setnx key value

# 示例
setnx k2 22
  1. getrange

获取指定区间范围内的值,类似between…and 的关系

# 格式
getrange key start end

# 示例
getrange k1 2 -1
  1. setrange

替换指定区间范围内的值,类似between…and 的关系

# 格式
setrange key offset value

# 示例
setrange k1 2 test
  1. mset

同时设置一个或多个 key-value 。

# 格式
mset key1 value1 key2 value2

# 示例
mset k3 test1 k4 test2 
  1. getset

将给定key值设为value,并返回key的旧值(old value),简单一句话(先get然后立即set)。

# 格式
getset key value

# 示例
 getset k1 java
字符串操作
关键字含义示例
strlen获取字符串值的长度。当储存的不是字符串值时,返回一个错误。strlen k1
setex设置key值过期时间。key存在会替换旧的值,并设置过期时间。setex k1 10 test
incr/decr将 key 中储存的数字值增一/减一。incr k2
incrby/decrby将key存储的数字值按照step进行增减。incrby k2 10
  1. strlen

获取指定 key 所储存的字符串值的长度。当 key 储存的不是字符串值时,返回一个错误。

# 格式
strlen key

# 示例
strlen k1
  1. setex

给指定的 key 设置值及time 秒的过期时间。如果 key 已经存在,setex命令将会替换旧的值,并设置过期时间。

# 格式
setex key time value

# 示例
 setex k1 10 test
  1. incr

将 key 中储存的数字值增一。

# 格式
incr key

# 示例
incr k2
  1. decr

将 key 中储存的数字值减一。

# 格式
decr key

# 示例
decr k2
  1. incrby/decrby

将key存储的数字值按照step进行增减。

# 格式
incrby/decrby key step

# 示例
incrby k2 10

③、List

List是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。底层是一个双向链表,对两段操作性能极高,通过索引操作中间的节点性能较差。一个List最多可以包含 2 32 − 1 2^{32}-1 2321个元素 ( 每个列表超过40亿个元素)。

使用场景

  1. 消息队列
  2. 排行榜
  3. 最新列表
增加list元素
关键字含义示例
lpush/rpush从左边(头部)/右边(尾部)插入一个或多个值。lpush list 333
linsert指定值的前边/后边插入一个new value值(从左开始)。linsert list before 44 test
  1. lpush/rpush

从左边(头部)/右边(尾部)插入一个或多个值

# 格式
lpush/rpush key1 value1 value2 value3……

# 示例
lpush list 333
  1. linsert

在列表中value值的前边/后边插入一个new value值(从左开始)。

# 格式
linsert key before/after value newvalue

# 示例
linsert list before 44 test
查询list元素
关键字含义示例
lrange返回key列表中的start和end之间的元素(包含start和end)。lrange list 0 -1
lindex获取列表index位置的值(从左开始)。lindex list -1
llen获取列表长度。llen list
  1. lrange

返回key列表中的start和end之间的元素(包含start和end)。 其中 0 表示列表的第一个元素,-1表示最后一个元素。

# 格式
lrange key start end

# 示例
lrange list 0 -1
  1. lindex

取列表index位置的值(从左开始)。

# 格式
lindex key index

# 示例
lindex list -1
  1. llen

获取列表长度。

# 格式
llen key

# 示例
llen list
删除list元素
关键字含义示例
lpop/rpop移除并返回第一个值或最后一个值。lpop list
lrem从左边开始删除与value相同的count个元素。lrem list 123
  1. lpop/rpop

移除并返回第一个值或最后一个值。

# 格式
lpop/rpop key

# 示例
lpop list 
  1. lrem

从左边开始删除与value相同的count个元素。

# 格式
lrem key count value

# 示例
lrem list 123 
修改list元素
关键字含义示例
lset将索引为index的值设置为valuelset list 2 test1
  1. lset

将索引为index的值设置为value

# 格式
lset key index value

# 示例
lset list 2 test1

④、Set

与List类似是一个列表功能,但Set是自动排重的,当需要存储一个列表数据,又不希望出现重复数据时,Set是一个很好的选择。Set是String类型的无序集合,它底层其实是一个value为null的hash表,所以添加、删除、查找的时间复杂度都是O(1)。

使用场景

  1. 黑白名单
  2. 随机展示
  3. 好友
  4. 关注人
  5. 粉丝
  6. 感兴趣的人集合
增加set元素
关键字含义示例
sadd将一个或多个元素添加到集合key中,已经存在的元素将被忽略。sadd setlist test1 test2
smove将value元素从sourcekey集合移动到destinationkey集合中。smove setlist2 setlist tt1
  1. sadd

将一个或多个元素添加到集合key中,已经存在的元素将被忽略。

# 格式
sadd key value1 value2……

# 示例
sadd setlist test1 test2 test3
  1. smove

将value元素从sourcekey集合移动到destinationkey集合中。如果 sourcekey集合不存在或不包含指定的 value元素,则smove 命令不执行任何操作,仅返回 0 。

# 格式
smove sourcekey destinationkey value

# 示例
smove setlist2 setlist tt1
查询set元素
关键字含义示例
smembers取出该集合的所有元素。smembers setlist
sismember判断集合key中是否含有value元素,如有返回1,否则返回0。sismember setlist tt1
scard返回该集合的元素个数。scard setlist
srandmember随机取出集合中count个元素,但不会删除。srandmember setlist 2
  1. smembers

取出该集合的所有元素。

# 格式
smembers key

# 示例
smembers setlist
  1. sismember

判断集合key中是否含有value元素,如有返回1,否则返回0。

# 格式
sismember key value

# 示例
 sismember setlist tt1
  1. scard

返回该集合的元素个数。

# 格式
scard key

# 示例
scard setlist
  1. srandmember

随机取出集合中count个元素,但不会删除。

# 格式
srandmember key count

# 示例
srandmember setlist 2
删除set元素
关键字含义示例
srem删除集合中的一个或多个成员元素,不存在的成员元素会被忽略。srem setlist test1
spop随机删除集合中一个元素并返回该元素。spop setlist
  1. srem

删除集合中的一个或多个成员元素,不存在的成员元素会被忽略。

 # 格式
 srem key value1 value2……

# 示例
srem setlist test1
  1. spop

随机删除集合中一个元素并返回该元素。

# 格式
spop key

# 示例
spop setlist
交集并集差集
关键字含义示例
sinter返回两个集合的交集元素。sinter setlist setlist2
sunion返回两个集合的并集元素。sunion setlist setlist2
sdiff返回两个集合的差集元素(key1中的,不包含key2)sdiff setlist setlist2
  1. sinter

返回两个集合的交集元素。

# 格式
sinter key1 key2

# 示例
sinter setlist setlist2
  1. sunion

返回两个集合的并集元素。

# 格式
sunion key1 key2

# 示例
sunion setlist setlist2
  1. sdiff

返回两个集合的差集元素(key1中的,不包含key2)

# 格式
sdiff key1 key2

# 示例
sdiff setlist setlist2

⑤、Hash

Hash是一个键值对的集合。Hash 是一个 String 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。

使用场景

  1. 购物车
  2. 存储对象
设置hset的值
关键字含义示例
hset给key集合中的field赋值value。hset user name test age 12 sex “男”
hget从key哈希中,取出field字段的值。hget user name
hmset批量设置哈希的字段及值。hmset user name java age 22 sex nan
hsetnx给key哈希表中不存在的的字段赋值 。hsetnx user h 115
  1. hset

给key集合中的field赋值value。

# 格式
hset key field value

# 示例
hset user name test age 12 sex "男"
  1. hget

从key哈希中,取出field字段的值。

# 格式
hget key field

# 示例
hget user name
  1. hmset

批量设置哈希的字段及值。

# 格式
hmset key field1 value1 field2 value2……

# 示例
hmset user name java age 22 sex nan
  1. hsetnx

给key哈希表中不存在的的字段赋值 。

# 格式
hsetnx key field value

# 示例
hsetnx user h 115
查询hset信息
关键字含义示例
hexists判断指定key中是否存在field。1:含有 ;0:不含/不存在 。hexists user name
hkeys获取该哈希中所有的field。hkeys user
hvals获取该哈希中所有的value。hvals user
  1. hexists

判断指定key中是否存在field,如果哈希表含有给定字段,返回 1 。 如果哈希表不含有给定字段,或 key 不存在,返回 0 。

# 格式
hexists key field

# 示例
hexists user name
  1. hkeys

获取该哈希中所有的field。

# 格式
hkeys key

# 示例
hkeys user
  1. hvals

获取该哈希中所有的value。

# 格式
hvals key

# 示例
hvals user
修改hset中的值
关键字含义示例
hincrby为哈希表key中的field字段的值加上增量increment。hincrby user age 5
  1. hincrby

为哈希表key中的field字段的值加上增量increment。

# 格式
hincrby key field increment

# 示例
hincrby user age 5
删除hset中的值
关键字含义示例
hdel删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略。hdel user h
  1. hdel

删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略。

# 格式
hdel key field1 field2……

# 示例
hdel user h

⑥、Zset

Zset与Set非常相似,是一个没有重复元素的String集合。不同之处是Zset的每个元素都关联了一个分数(score),这个分数被用来按照从低分到高分的方式排序集合中的元素。集合的元素是唯一的,但分数可以重复。

增加zset的元素
关键字含义示例
zadd将一个或多个元素(value)及分数(score)加入到有序集key中。zadd clazz 99 math
  1. zadd

将一个或多个元素(value)及分数(score)加入到有序集key中。

# 格式
zadd key score1 value1 score2 value2……

# 示例
zadd clazz 99 math
查询zset的元素
关键字含义示例
zrange返回key集合中的索引start和索引end之间的元素。zrange clazz 0 -1
zrangebyscore返回key集合中的分数1和分数2 之间的元素。zrangebyscore clazz 0 100
zcount统计该集合在分数1到分数2区间中元素的个数。zcount clazz 0 100
zrank返回value在集合中的排名,从0开始。zrank clazz math
  1. zrange

返回key集合中的索引start和索引end之间的元素(包含start和end)。

# 格式
zrange key start end [withscores]

# 示例
zrange clazz 0 -1
  1. zrangebyscore

返回key集合中的分数minscore 和分数maxscore 之间的元素(包含minscore 和maxscore )。其中元素的位置按分数值递增(从小到大)来排序。

# 格式
zrangebyscore key minscore maxscore [withscores]

# 示例
zrangebyscore clazz 0 100
  1. zcount

统计该集合在minscore 到maxscore分数区间中元素的个数。

# 格式
zcount key minscore maxscore

# 示例
zcount clazz 0 100
  1. zrank

返回value在集合中的排名,从0开始。

# 格式
zrank key value

# 示例
zrank clazz math
修改zset元素
关键字含义示例
zincrby为元素value的score加上increment的值。zincrby clazz 10 english
  1. zincrby

为元素value的score加上increment的值。

# 格式
zincrby key increment value

# 示例
zincrby clazz 10 english
删除zset的元素
关键字含义示例
zrem删除该集合下value的元素。zrem clazz english
  1. zrem

删除该集合下value的元素。

# 格式
zrem key value

# 示例
zrem clazz english

⑦、Bitmaps

在计算机中,用二进制(位)作为存储信息的基本单位,1个字节等于8位。

例如 “abc” 字符串是由 3 个字节组成,计算机存储时使用其二进制表示,"abc"分别对应的ASCII码是97、98、99,对应的二进制是01100001、01100010、01100011,在内存中表示如下:

Redis提供了Bitmaps这个 “数据结构” 可以实现对位的操作:

使用场景

  1. 活跃天数
  2. 打卡天数
  3. 登录天数
  4. 用户签到
  5. 统计活跃用户
  6. 统计用户是否在线
  7. 实现布隆过滤器
新增Bitmaps元素
关键字含义示例
setbit设置Bitmaps中某个偏移量的值。setbit zk:1 0 1
  1. setbit

设置Bitmaps中某个偏移量的值。

# 格式
setbit key offset value

# 示例
setbit zk:1 0 1
查询Bitmaps元素
关键字含义示例
getbit获取Bitmaps中某个偏移量的值。getbit zk:1 0
bitcount统计字符串被设置为1的bit数量。bitcount zk:1
  1. getbit

获取Bitmaps中某个偏移量的值。

# 格式
getbit key offset

# 示例
getbit zk:1 0
  1. bitcount

统计字符串被设置为1的bit数量。一般情况下,给定的整个字符串都会被进行统计,可以选择通过额外的start和end参数,指定字节组范围内进行统计(包括start和end),0表示第一个元素,-1表示最后一个元素。

# 格式
bitcount key [start end]

# 示例
bitcount zk:1
交集并集
关键字含义示例
bitop将多个bitmaps通过求交集/并集方式合并成一个新的bitmaps。bitop and test zk:1 zk:2
  1. bitop

将多个bitmaps通过求交集/并集方式合并成一个新的bitmaps。

# 格式
bitop and/or destkey sourcekey1 sourcekey2……

# 示例
bitop and test zk:1 zk:2

⑧、Geospatia

GEO,Geographic,地理信息的缩写。该类型就是元素的二维坐标,在地图上就是经纬度。Redis基于该类型,提供了经纬度设置、查询、范围查询、距离查询、经纬度Hash等常见操作。

使用场景

  1. 附近的电影院
  2. 附近的好友
  3. 离最近的火锅店
关键字含义示例
geoadd用于存储指定的地理空间位置。geoadd china 116.407143 39.916042 beijin
geopos返回所有指定名称的地理空间位置。geopos china beijin
geodist用于返回两个给定位置之间的距离。geodist china beijin chengdu
georadius指定半径的所有位置元素。georadius china 116.407143 39.916042 1000 km
  1. geoadd

坐标拾取器:https://api.map.baidu.com/lbsapi/getpoint/index.html

用于存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key中。

# 格式
geoadd key longitude latitude member

# 示例
geoadd china 116.407143 39.916042 beijin
  1. geopos

从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回 nil。

# 格式
geopos key member [member ……]

# 示例
geopos china beijin
  1. geodist

用于返回两个给定位置之间的距离。

# 格式
geodist key member1 member2 [m|km|ft|mi]

# 示例
geodist china beijin chengdu
  1. georadius

以给定的经纬度(longitude latitude)为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离(radius )的所有位置元素。

# 格式
georadius key longitude latitude radius m|km|ft|mi  

# 示例
georadius china 116.407143 39.916042 1000 km

⑨、Hyperloglog

在我们做站点流量统计的时候一般会统计页面UV(独立访客:uniquevisitor)和PV(即页面浏览量:page view)。redis HyperLogLog是用来做基数统计的算法,HyperLogLog的优点是:在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且使很小的。

使用场景

  1. 网站PV统计
  2. 网站UV统计
  3. 统计访问量(IP数)
  4. 统计在线用户数
  5. 统计每天搜索不同词条的个数
  6. 统计文章真实阅读数
关键字含义示例
pfadd将所有元素参数添加到 数据结构中。pfadd java user1 user2 user3 xiaoming
pfcount统计基数总数。pfcount java python
pfmerge将一个或多个合并成一个。pfmerge clazz java python
  1. pfadd

将所有元素参数添加到 Hyperloglog 数据结构中。如果至少有个元素被添加返回 1, 否则返回 0。

# 格式
pfadd key element1 element2……

# 示例
pfadd java user1 user2 user3 xiaoming
  1. pfcount

计算Hyperloglog 近似基数,可以计算多个Hyperloglog ,统计基数总数。

# 格式
pfcount key1 key2……

# 示例
pfcount java python
  1. pfmerge

将一个或多个Hyperloglog(sourcekey1) 合并成一个Hyperloglog (destkey )。

# 格式
pfmerge destkey sourcekey1 sourcekey2……

# 示例
pfmerge clazz java python

# 二、JAVA整合Redis

version1.0

导入依赖

Jedis是Redis官方推荐的Java连接开发工具

    <dependencies>
        <!-- redis 依赖 -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.6.0</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

配置文件

①、单机配置
    public static void main(String[] args) {
        /**
         * 参数一:ip地址
         * 参数二:端口
         */
        Jedis jedis = new Jedis("192.168.66.11",6379);
        // 1. 验证是否链接成功
        System.out.println(jedis.ping());
        // end : jedis使用完毕需要关闭
        jedis.close();
    }
②、集群配置
    public static void main(String[] args) throws IOException {
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(20);
        config.setMaxIdle(10);
        config.setMinIdle(5);
        Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();
        jedisClusterNode.add(new HostAndPort("192.168.66.101", 8001));
        jedisClusterNode.add(new HostAndPort("192.168.66.102", 8002));
        jedisClusterNode.add(new HostAndPort("192.168.66.103", 8003));
        JedisCluster jedisCluster = null;
        try {
            /**
             * 参数一:Redis 集群地址
             * 参数二:指的是连接一个url的连接等待时间
             * 参数三:指的是连接上一个url,获取response的返回等待时间
             * 参数四:最大尝试次数
             * 参数五:连接密码
             * 参数六:Redis 配置
             */
            jedisCluster = new JedisCluster(jedisClusterNode, 6000, 5000, 10, "redis-pw", config);
            System.out.println(jedisCluster.set("name", "zhangsan"));
            System.out.println(jedisCluster.get("name"));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (jedisCluster != null) {
                jedisCluster.close();
            }
        }
    }

操作redis

①、String

类似Linux中操作Redis

    public static void main(String[] args) {
        Jedis jedis = new Jedis("192.168.66.11",6379);
        // 1. 验证是否链接成功
        System.out.println(jedis.ping());
        // 2. 设置一个key
        jedis.set("k1","v1");
        // 3. 获取一个key
        String res = jedis.get("k1");
        // 4. 对某一个key自增
        Long ires = jedis.incr("k2");
        // end : jedis使用完毕需要关闭
        jedis.close();
    }
②、List

类似Linux中操作Redis

    public static void main(String[] args) {
        Jedis jedis = new Jedis("192.168.66.11", 6379);
        // 1. 验证是否链接成功
        System.out.println(jedis.ping());
        // 2. 向list中添加数据
        jedis.lpush("list1", "v1", "v2", "v3");
        // 3. 返回list全部数据
        List<String> list = jedis.lrange("list1", 0, -1);
        // end : jedis使用完毕需要关闭
        jedis.close();
    }
③、set

类似Linux中操作Redis

    public static void main(String[] args) {
        Jedis jedis = new Jedis("192.168.66.11", 6379);
        // 1. 验证是否链接成功
        System.out.println(jedis.ping());
        // 2. 向set中添加数据
        jedis.sadd("set1" ,"v1","v2","v2","v3");
        // 3. 查看该集合中有多少个元素
        jedis.smembers("set1");
        // end : jedis使用完毕需要关闭
        jedis.close();
    }
④、hash

类似Linux中操作Redis

    public static void main(String[] args) {
        Jedis jedis = new Jedis("192.168.66.11", 6379);
        // 1. 验证是否链接成功
        System.out.println(jedis.ping());
        // 2. 设置一个hash
        jedis.hset("user","age","25");
        // 3. 获取该key的所有value
        jedis.hvals("user");
        // end : jedis使用完毕需要关闭
        jedis.close();
    }
⑤、zset

类似Linux中操作Redis

    public static void main(String[] args) {
        Jedis jedis = new Jedis("192.168.66.11", 6379);
        // 1. 验证是否链接成功
        System.out.println(jedis.ping());
        // 2. 向zset中添加一条数据
        jedis.zadd("zset1",100,"java");
        // 3. 获取所有的值
        jedis.zrange("zset1",0,-1);
        // end : jedis使用完毕需要关闭
        jedis.close();
    }
⑥、Bitmaps

类似Linux中操作Redis

    public static void main(String[] args) {
        Jedis jedis = new Jedis("192.168.66.11", 6379);
        // 1. 验证是否链接成功
        System.out.println(jedis.ping());
        // 2. 将b1偏移量为0的位设置为1
        jedis.setbit("b1",0, "1");
        // 3. 获取b1偏移量为0的位
        jedis.getbit("b1",0);
        // end : jedis使用完毕需要关闭
        jedis.close();
    }
⑦、Geospatia

类似Linux中操作Redis

    public static void main(String[] args) {
        Jedis jedis = new Jedis("192.168.66.11", 6379);
        // 1. 验证是否链接成功
        System.out.println(jedis.ping());
        // 2. 添加一条地理信息数据
        jedis.geoadd("chinacity",116.412318,39.999664,"beijing");
        // end : jedis使用完毕需要关闭
        jedis.close();
    }
⑧、Hyperloglog

类似Linux中操作Redis

    public static void main(String[] args) {
        Jedis jedis = new Jedis("192.168.66.11", 6379);
        // 1. 验证是否链接成功
        System.out.println(jedis.ping());
        // 2. 将所有元素参数添加到 Hyperloglog 数据结构中。
        jedis.pfadd("book","c++","java","php");
        // end : jedis使用完毕需要关闭
        jedis.close();
    }

二、SpringBoot整合Redis

Spring-Data-Redis是spring大家族的一部分,通过简单的配置访问Redis服务,对Reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate提供了Redis各种操作、异常处理及序列化,支持发布订阅。

  • RedisTemplate介绍

Spring封装了RedisTemplate对象来进行对Redis的各种操作,它支持所有的Redis原生的api。

org.springframework.data.redis.core
Class RedisTemplate<K,V>

注意:

  1. K:模板中的Redis key的类型,模板中的Redis key的类型(通常为String)如:RedisTemplate<String, Object>。
  2. V:模板中的Redis value的类型
  • RedisTemplate中定义了对5种数据结构操作
redisTemplate.opsForValue();//操作字符串
redisTemplate.opsForHash();//操作hash
redisTemplate.opsForList();//操作list
redisTemplate.opsForSet();//操作set
redisTemplate.opsForZSet();//操作有序set
  • StringRedisTemplate与RedisTemplate
  • 两者的关系是StringRedisTemplate继承RedisTemplate。
  • 两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。
  • SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

version1.0

导入依赖

 <dependencies>
        <!-- 添加redis 集成依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
        </dependency>
</dependencies>

配置文件

①、yml配置文件
  • application.yml
# redis 配置
spring:
  redis:
    #Redis服务器连接地址
#    host: 192.168.66.11
    cluster:
      nodes: 192.168.66.101:8001,192.168.66.8002:8002
    #Redis服务器连接端口
    port: 6379
    jedis:
      pool:
        #连接池最大连接数(使用负值表示没有限制)
        max-active: 8
        #连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1
        #连接池中的最大空闲连接
        max-idle: 8
        #连接池中的最小空闲连接
        min-idle: 0
    #连接超时时间(毫秒)
    timeout: 30000
  # mysql数据库配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&&useSSL=false
    username: root
    password: root
  # jpa配置
  jpa:
    database: mysql
    show-sql: true
    hibernate:
      ddl-auto: update
# 日志格式
logging:
  pattern:
    console: '[%yellow(%date{yyyy-MM-dd HH:mm:ss.SSS}) %highlight(%-5level)] [%cyan(%X{traceid}) %magenta(%-15thread)] [%green(%-50logger){50}] : %.4000m%n'
②、redis序列化配置
  • class
@Configuration
public class RedisConfig {
    /**
     * 数据存储 序列化修改
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        //添加序列化机制
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        // 添加
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        return redisTemplate;
    }
}

操作redis

基础操作

通过RedisTemplate对象操作

①、opsForValue(string)
方法含义示例
set添加元素redisTemplate.opsForValue().set(“k1”,“testk1”);
添加元素并设置过期时间set(“k2”,“test2”,10, TimeUnit.SECONDS);
get获取元素redisTemplate.opsForValue().get(“k1”);
    @Autowired
    private RedisTemplate redisTemplate;
    @Test
    public void addString(){
        redisTemplate.opsForValue().set("k1","testk1");
    }
②、opsForList(list )
方法含义示例
rightPush添加元素redisTemplate.opsForList().rightPush(“list”,“test1”);
range获取元素redisTemplate.opsForList().range(“list”, 0, -1);
    @Test
    public void testList(){
        redisTemplate.opsForList().rightPush("list","test1");
    }
③、opsForHash(hash)
方法含义示例
put添加元素redisTemplate.opsForHash().put(“user”,“name”,“xiaoming”);
get获取数据redisTemplate.opsForHash().get(“user”, “name”);
    @Test
    public void testHash(){
        redisTemplate.opsForHash().put("user","name","xiaoming");
    }
④、opsForSet(set)
方法含义示例
add添加元素redisTemplate.opsForSet().add(“k1”,“test2”);
size获取set的长度redisTemplate.opsForSet().size(“k1”);
members获取元素redisTemplate.opsForSet().members(“k1”);
    @Test
    public void testSet(){
        redisTemplate.opsForSet().add("k1","test2");
    }
⑤、opsForZSet(zset )
方法含义示例
add添加元素redisTemplate.opsForZSet().add(“clazz”,“math”,99);
range获取元素redisTemplate.opsForZSet().range(“clazz”, 0, 100);
    @Test
    public void testZset(){
        redisTemplate.opsForZSet().add("clazz","math",99);
    }
web应用redis

Lombok、spring mvc、spring data redis、spring data jpa

导入依赖
    <dependencies>
        <!-- redis  依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
        </dependency>
        <dependency>
            <groupId>io.projectreactor</groupId>
            <artifactId>reactor-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- jpa 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <!-- spring mvc 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- mysql依赖 -->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!-- fast json-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.60</version>
        </dependency>
        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!-- junit -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
配置文件
# redis 配置
spring:
  redis:
    #Redis服务器连接地址
    host: 192.168.66.66
    #Redis服务器连接端口
    port: 6379
    jedis:
      pool:
        #连接池最大连接数(使用负值表示没有限制)
        max-active: 8
        #连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1
        #连接池中的最大空闲连接
        max-idle: 8
        #连接池中的最小空闲连接
        min-idle: 0
    #连接超时时间(毫秒)
    timeout: 30000
# mysql数据库配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&&useSSL=false
    username: root
    password: root
# jpa配置
  jpa:
    database: mysql
    show-sql: true
    hibernate:
      ddl-auto: update
# 日志格式
logging:
  pattern:
    console: '[%yellow(%date{yyyy-MM-dd HH:mm:ss.SSS}) %highlight(%-5level)] [%cyan(%X{traceid}) %magenta(%-15thread)] [%green(%-50logger){50}] : %.4000m%n'
使用缓存
service
@Service
public class GoodsService {
    //商品
    @Autowired
    private GoodsRepository goodsRepository;
    @Autowired
    private StringRedisTemplate redisTemplate;

    /**
     * 根据id获取商品信息
     *
     * @param id
     * @return
     */
    public GoodsEntity getId(Long id) {
        // 从Redis中获取缓存
        String goodsStr = redisTemplate.opsForValue().get("goods:id:" + id);
        // 判断是否有缓存
        if (StringUtils.isEmpty(goodsStr)) {
            //根据id查询商品信息
            GoodsEntity goodsEntity = goodsRepository.getById(id);
            //添加缓存
            redisTemplate.opsForValue().set("goods:id:" + id, JSON.toJSONString(goodsEntity));
            return goodsEntity;
        } else {
            // 把json数据转为goods对象
            return JSON.parseObject(goodsStr, GoodsEntity.class);
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值