分类:Redis

Redis学习(三)Java客户端Jedis

Redis的客户端有很多,比如Java客户端Jedis,Python客户端redis-py,Go客户端redigo等;我们学习的是java语言,这里我们介绍和学习java客户端Jedis。

1、什么是Jedis

Redis提供的以Java API方式使用redis的客户端,就是在java上使用redis的工具。

2、获取Jedis

Maven依赖方式:

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
    <type>jar</type>
    <scope>complie</scope>
</dependency>

3、Jedis直连

#1.生成一个Jedis对象,这个对象负责和指定Redis节点进行通信
Jedis jedis = new Jedis("127.0.0.1",6379);
#2.jedis执行set操作
jedis.set("hello","world");
#3.jedis执行get操作,value=“world”
String value = jedis.get("hello");

Jedis的构造函数:

Jedis(String host,int port,int connectionTimeout,int soTimeout)

host:Redis节点的所在机器的IP

port:Redis节点的端口

connectionTimeout:客户端连接超时

soTimeout:客户端读写超时

4、简单使用

1.String

//1.string
//输出结果:ok
jedis.set("hello","world");
//输出结果:world
jedis.get("hello");
//输出结果:1
jedis.incr("counter");

2.hash

//2.hash
jedis.hset("myhash","f1","v1");
jedis.hset("myhash","f2","v2");
//输出结果:{f1=v1,f2=v2}
jedis.hgetAll("myhash");

3.list

//3.list
jedis.rpush("mylist","1");
jedis.rpush("mylist","2");
jedis.rpush("mylist","3");
//输出结果:[1,2,3]
jedis.lrange("mylist",0,-1);

4.set

//4.set
jedis.sadd("myset","a");
jedis.sadd("myset","b");
jedis.sadd("myset","a");
//输出结果:[b,a]
jedis.smembers("myset");

5.zset

//5.zset
jedis.zadd("myzset",99,"tom");
jedis.zadd("myzset",66,"peter");
jedis.zadd("myzset",33,"james");
//输出结果:[[["james"],33.0],[["peter"],66.0],[["tom"],99.0]]
jedis.zrangeWithScores("myzset",0,-1);

5、Jedis连接池

Jedis直连:1.生成Jedis对象2.Jedis执行命令3.返回执行结果4.关闭Jedis连接

Jedis连接池:1.从资源池借Jedis对象2.Jedis执行命令3.返回执行结果4.归还Jedis对象给连接池

优点 缺点
直连
  • 简单方便

  • 适用于少量长期连接的场景

  • 存在每次新建/关闭TCP开销

  • 资源无法控制,存在连接泄漏的可能

  • Jedis对象线程不安全

连接池
  • Jedis预先生成,降低开销使用

  • 连接池的形式保护和控制资源的使用

相对于直连,使用相对麻烦,尤其在资源的管理上需要很多参数来保证,一旦规划不合理也会出现问题

简单使用:

//初始化Jedis连接池,通常来讲JedisPool是单例的。
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
JedisPool jedisPool = new JedisPool(poolConfig,"ip","port");
Jedis jedis = null;
try{
    //1.从连接池获取jedis对象
    jedis = jedisPool.getResource();
    //2.执行操作
    jedis.set("hello","world");
}catch(Exeception e){
    e.printStackTrace();
}finally{
    if(jedis != null)
    //如果使用JedisPool,close操作不是关闭连接,代表归还连接池
    jedis.close();
}

Redis学习(二)redis API的使用

1、通用命令

这里先简单的列出6个常用的命令,之后逐步的学习更多的命令;

命令名 功能 用法  示例
keys 遍历key

keys [pattern]

生产环境不推荐使用

keys *  1537325301674010.png

dbsize
计算key的总数

dbsize

可以在线上使用

1537325651874645.png
exists
检查key是否存在

exists key

可以在线上使用 

1537325812209989.png
del 删除指定key-value del key,可以删除多个
1537326389630969.png
expire、ttl、persist key过期命令

#key在seconds秒后过期

expir

e key seconds 

#查看key剩余的过期时间

ttl key

#去掉key的过期时间

persist key

1537326307872919.png
type 返回key的类型 type key 1537327573348376.png

2、字符串

2.1  字符串键值结构

key为字符串类型,值可以为字符串、整型、二进制、json、xml等;(值不能大于512MB)

2.2 字符串使用场景

缓存、计数器、分布式锁等

2.3 API

API 功能描述 时间复杂度
get key 获取key对应的value o(1)
set key value 设置key-value o(1)
del key 删除key-value o(1)
incr key  key自增1,如果key不存在,自增后get(key)=1 o(1)
decr key key自减1,如果key不存在,自减后get(key)=-1 o(1)
incrby key k key自增k,如果key不存在,自增后get(key)=k o(1)
decrby key k key自减k,如果key不存在,自减后get(key)=-k o(1)
set key value 不管key是否存在,都设置 o(1)
setnx key value key不存在,才设置 (理解为添加) o(1)
set key value xx key存在,才设置    (理解为更新) o(1)
mget key1 key2 key3… 批量获取key,原子操作 o(n)
mset key1 value1 key2 value2 key3 value3 批量设置key-value o(n)
getset key newvalue set key newvalue并返回旧的value  o(1)
append key value
将value追加到旧的value o(1)
strlen key 返回字符串的长度(注意中文) o(1)
incrybyfloat key 3.5
增加key对应的值3.5 o(1)
getrange key start end 获取字符串指定下标所有的值 o(1)
setrange key index value 设置指定下标所有对应的值 o(1)

3、HASH

3.1  哈希键值结构

key是字符串类型,value分为field和value即属性和value;需要注意field不能相同,value可以相同

例如:

image.png

3.2 API

API 功能描述 时间复杂度
hget key field
获取hash key对应的field的value o(1)
hset key field value 设置hash key对应field的value o(1)
hdel key field 删除hash key对应field的value o(1)
hexists key field 判断hash key是否有field o(1)
hlen key 获取hash key field的数量 o(1)
hmget key field1 field2 … fieldN 批量获取hash key的一批field对应的值 o(n)
hmset key field1 value1 field2 value2 …fieldN valueN 批量设置hash key的一批field value o(n)
hgetall key
返回hash key对应所有的field和value o(n)
hvals key 返回hash key对应所有的field的value o(n)
hkeys key 返回hash key对应所有field o(n)
hsetnx key field value
设置hash key对应field的value(如果field已经存在,则失败) o(1)
hincrby key field intCounter hash key对应的field的value自增intCounter o(1)
hincrbyfloat key field floatCounter
hincrby浮点数版 o(1)

4、列表(List)

4.1 列表结构

 image.png

4.2特点

有序、可以重复、左右两边插入弹出

4.3 API

API 功能描述 时间复杂度
rpush key value1 value2 … valueN 从列表右端插入值(1-N个) o(1~n)
lpush key value1 value2 … valueN 从列表左端插入值(1-N个) o(1~n)
linsert key before|after value newValue
在list指定的值前|后插入newValue
o(n)
lpop key
从列表左侧弹出一个item
o(1)
rpop key
从列表右侧弹出一个item o(1)
lrem key count value

根据count值,从列表删除所有value相等的项

(1)count>0,从左到右,删除最多count个value相等的项

(2)count<0,从右到左,删除最多Math.abs(count)个value相等的项

(3)count=0,删除所有value相等的项

o(n)
ltrim key start end 按照索引范围修剪列表 o(n)
lrange key start end(包含end) 获取列表指定索引范围所有item o(n)
lindex key index
获取列表指定索引的item o(n)
llen key
获取列表长度 o(1)
lset key index newValue 设置列表指定索引值为newValue o(n)
blpop key timeout
lpop阻塞版本,timeout是阻塞超时时间,timeout=0为永远不阻塞 o(1)
brpop key timeout
rpop阻塞版本,timeout是阻塞超时时间,timeout=0为永远不阻塞 o(1)

4.4 列表应用

时间线功能

小技巧:

  1. LRUSH + LPOP = Stack     实现栈

  2. LPUSH + RPOP = Queue    实现队列

  3. LPUSH + LTRIM = Capped Collection 有固定数量的列表

  4. LPUSH + BRPOP = Message Queue 消息队列

5、集合

5.1 集合结构

image.png

5.2 集合特点

无序、无重复、支持集合间操作

5.3 集合内API

API 功能描述 时间复杂度
sadd key element 向集合key添加element(如果element已经存在,添加失败) o(1)
srem key element
将集合key中的element移除掉 o(1)
scard key
计算集合大小
sismember key element 判断元素是否在集合中
srandmember key count 从集合中随机取出count个元素
smembers key 取出集合中的所有元素
spop key 从集合中随机弹出一个元素

5.4 集合内操作应用

微博抽奖系统、微博点赞、用户标签

5.5 集合间API

API 功能描述 时间复杂度
sdiff
差集
sinter 交集
sunion 并集
sdiff|sinter|suion + store destkey ..
将差集、交集、并集结果保存在destkey中

5.6 集合间操作应用

社交app中的共同关注功能

集合简单的使用:

1.SADD = Tagging 标签

2.SPOP/SRANDMEMBER = Random item 随机数

3.SADD + SINTER = Social Graph 社交相关应用

6、有序集合

6.1 有序集合结构

image.png

按照score来指定顺

6.2 有序集合API

API 功能描述 时间复杂度
zadd key score element(score可以重复)
添加score和element o(longN)
zrem key element(可以删除多个)
删除元素
o(1)
zscore key element
返回元素的分数 o(1)
zincrby key increScore element
增加或减少元素分数 o(1)
zcard key 返回元素的总个数 o(1)
zrange key start end[WITHSCORES]
返回指定索引范围内的升序元素[分值] o(log(n)+m)
zrangebyscore key minScore maxScore[WITHSCORES]
返回指定分数范围内的升序元素[分值] o(log(n)+m)
zcount key minScore maxScore
返回有序集合内在指定分数范围内的个数 o(log(n)+m)
zremrangebyrank key start end 删除指定排名内的升序元素 o(log(n)+m)
zremrangebyscore key minScore maxScore 删除指定分数内的升序元素 o(log(n)+m)
zrank key 获取升序排名
zrevrank
获取降序排名
zrevrange key start end[WITHSCORES] 返回指定索引范围内的降序元素[分值]
zrevrangebyscore key minScore maxScore[WITHSCORES] 返回指定分数范围内的降序元素[分值]
zinterstore
交集运算存储
zunionstore 并集运算存储

6.3 有序集合应用

排行榜

Redis学习(一)redis简介与安装

1、何为Redis

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。                                                             — 百度百科

说白了,就是很牛逼的存储系统。

2、Redis的特性

  • 速度快 

数据存储在内存中、redis使用C语言编写、单线程的线程模型
  • 持久化

对数据的更新异步保存到磁盘
  • 多种数据结构 

Strings、HashTables、Linked Lists、Sets、Sorted Sets、BitMaps、HyperLogLog、GEO
  • 支持多种编程语言

Java、PHP、Python、Ruby、Lua、node.js等
  • 功能丰富

发布订阅、Lua脚本、事务、pipeline
  • 简单

源码少、不依赖外部库、单线程模型
  • 主从复制

主服务器数据可以复制到从服务器上
  • 高可用、分布式

Redis-Sentinel(v2.8)支持高可用、Redis-Cluster(v3.0)支持分布式

3、Redis典型应用场景

缓存系统、计数器、消息队列系统、排行榜、社交网络、实时系统

4、Redis的安装

#下载redis
wget  
#解压
tar -xzf redis-3.0.7.tar.gz
#建立软连接
ln -s redis-3.0.7 redis
#进入目录
cd redis
#编译和安装
make && make install

image.png

5、Redis的启动方式

最简启动:redis-server(使用了默认配置)

动态参数启动:redis-server –port 6380

配置文件启动:redis-server configPath (推荐)

      常用配置:daemonize — 是否是守护进程(no|yes) 建议使用yes

                     port  — Redis对外端口号

                     logfile — Redis系统日志

                     dir — Redis工作目录(日志文件及持久化文件存放的目录)

最简启动示例:

image.png

动态参数启动示例:

image.png

配置文件启动示例:

/opt/soft/redis目录下新建config目录,用来存放配置文件,然后复制一份默认的配置文件redis.conf 到 config目录下,为了方便查看和修改  使用  cat redis.conf | grep -v "#" | grep -v "^$" > redis-6381.conf  去掉注释和空格重定向为新的配置文件,一般都是用端口号来命名不同的配置文件,所以新的配置文件叫 redis-6381.conf  然后就可以修改配置和删除不需要的配置;这里配置文件仅有如下四个,以后的配置在之后的学习中逐渐的了解和学习。

image.png

修改完配置后,运行命令启动: redis-server config/redis-6381.conf   这样就启动成功了,详情看图:

image.png

6、Redis客户端连接

redis-cli -h ip(ip地址) -p(端口号) port

image.png

以上就是学习redis的第一步。。。坚持下去我们必定成功!!!