Redis从基础命令到实战之字符串类型
字符串类型是Redis中最基本的数据类型,能存储任何形式的字符串和和二进制数据。本文以代码形式列举常用的操作命令,并在实践部分演示一个简单的商品管理功能,实现了通常使用关系型数据库开发的增改查功能,注意并没有实现删除功能,这将放在后面的列表类型中去实现。
一、常用命令
pom.xml
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.8</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
</dependencies>
StringExample.java
import java.util.Iterator;
import java.util.List;
import java.util.Set; import redis.clients.jedis.Jedis; public class StringExample { public static void main(String[] args) {
Jedis jedis = JedisProvider.getJedis();
//清空数据库
jedis.flushDB(); String key = "redis_str";
//判断key是否存在
boolean exists = jedis.exists(key);
if (exists) {
//删除key,返回实际删除的行数
long l = jedis.del(key);
print("del " + key + "=" + l);
}
//新增key,成功返回 OK
String result = jedis.set(key, "a string value");
print("set " + key + "=" + result);
//读取value长度
print("strlen(" + key + ")=" + jedis.strlen(key));
//读取value
String value = jedis.get(key);
print("get " + key + "=" + value); //设置过期时间为5秒
jedis.expire(key, 5);
//查看某个key的剩余生存时间,单位秒,永久生存或者不存在的都返回-1
Long ttl = jedis.ttl(key);
print("ttl of " + key + "=" + ttl);
//移除某个key的生存时间
jedis.persist(key);
print("移除生存时间后 ttl of " + key + "=" + jedis.ttl(key));
//查看key所储存的值的类型
String type = jedis.type(key);
print("type of " + key + "=" + type); //一次性新增多个key
jedis.mset("key001", "value001", "key002", "value002", "key003",
"value003", "key004", "value004");
print("批量设置key: key001,key002,key003,key004"); //读取所有key,遍历,判断类型
System.out.println("读取所有key并筛选string类型");
Set<String> keys = jedis.keys("*");
Iterator<String> it = keys.iterator();
while (it.hasNext()) {
key = it.next();
if (jedis.type(key).equals("string"))
System.out.println("get " + key + "=" + jedis.get(key));
}
System.out.println("------------------------------------------------------");
System.out.println(); //一次性获取多个key值
System.out.println("批量读取key: key001,key002,key003,key004");
List<String> list = jedis.mget("key001", "key002", "key003", "key004");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("------------------------------------------------------");
System.out.println();
//一次性删除多个key,返回成功删除个数
Long del = jedis.del(new String[] { "key001", "key002" });
print("[批量删除]del key001,key002=" + del); // 禁止覆盖
Long setnx = jedis.setnx("key003", "value003_new");
print("[禁止覆盖]setnx key003 to value003_new=" + setnx + "; value=" + jedis.get("key003")); //新增key同时设置有效期(秒)
result = jedis.setex(key, 3, "setex demo");
print("setex " + key + "(ttl 3)=" + result + "; value=" + jedis.get(key) + "; ttl=" + jedis.ttl(key));
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
}
print("[4秒之后]get " + key + "=" + jedis.get(key)); //获取原值, 更新为新值一步完成
key = "key003";
String former = jedis.getSet(key, "value002-after-getset");
print("getSet 原值:" + former + "; 新值" + jedis.get(key)); //incr 自增
key = "redis_num";
jedis.del(key);
long incr = jedis.incr(key);
print("incr " + key + " = " + incr);
incr = jedis.incr(key);
print("incr " + key + " = " + incr);
incr = jedis.incrBy(key, 100);
print("incrBy " + key + " 100 = " + incr);
Long decr = jedis.decrBy(key, 100);
print("decrBy " + key + " 100 = " + decr); jedis.close();
} private static void print(String info) {
System.out.println(info);
System.out.println("------------------------------------------------------");
System.out.println();
}
}
JedisProvider.java
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig; public class JedisProvider { private static JedisPool pool; public static Jedis getJedis() {
if(pool == null) {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(1024);
config.setMaxIdle(200);
config.setMaxWaitMillis(1000);
config.setTestOnBorrow(true);
config.setTestOnReturn(true);
pool = new JedisPool(config, "127.0.0.1", 6380);
}
return pool.getResource();
}
}
二、实践练习
StringLession.java
import java.util.ArrayList;
import java.util.List; import org.apache.commons.lang3.math.NumberUtils; import redis.clients.jedis.Jedis; public class StringLession { public static void main(String[] args) {
StringLession sl = new StringLession();
sl.clear(); //添加一批商品
for(int i = 0; i< 41; i++) {
Goods goods = new Goods(0, "goods" + String.format("%05d", i), i);
sl.addGoods(goods);
}
//读取商品总数
System.out.println("商品总数: " + sl.getTotalCount());
//分页显示
List<Goods> list = sl.getGoodsList(2, 20);
System.out.println("第二页商品:");
for(Goods goods : list) {
System.out.println(goods);
}
} private Jedis jedis = null; public StringLession() {
this.jedis = JedisProvider.getJedis();
} /**
* 获得一个自增主键值
* @return
*/
private long getIncrementId() {
String key = "goods:count";
return jedis.incr(key);
} /**
* 添加一个商品
* @param goods
* @return
*/
public boolean addGoods(Goods goods) {
long id = getIncrementId();
goods.setId(id);
String key = "goods:" + id;
return jedis.set(key, goods.toString()).equals("OK");
} /**
* 修改商品
* @param goods
* @return
*/
public boolean editGoods(Goods goods) {
String key = "goods:" + goods.getId();
if(jedis.exists(key)) {
return jedis.set(key, goods.toString()).equals("OK");
}
return false;
} /**
* 读取商品总数
* @return
*/
public long getTotalCount() {
String key = "goods:count";
return NumberUtils.toLong(jedis.get(key));
} /**
* 读取用于分页的商品列表
* @param pageIndex 页数
* @param pageSize 每页显示行数
* @return
*/
public List<Goods> getGoodsList(int pageIndex, int pageSize) {
int totals = (int)getTotalCount();
int from = (pageIndex - 1) * pageSize;
if(from < 0) {
from = 0;
}
else if(from > totals) {
from = (totals / pageSize) * pageSize;
}
int to = from + pageSize;
if(to > totals) {
to = totals;
}
String[] keys = new String[(int)(to - from)];
for(int i = from; i < to; i++) {
keys[i - from] = "goods:" + (i + 1);
}
List<String> list = jedis.mget(keys);
List<Goods> goodsList = new ArrayList<>();
for(String value : list) {
goodsList.add(Goods.parseJson(value));
}
return goodsList;
} public void clear() {
jedis.flushDB();
}
}
Goods.java
import com.alibaba.fastjson.JSON; public class Goods { public Goods() {} public Goods(long id, String title, float price) {
super();
this.id = id;
this.title = title;
this.price = price;
} private long id;
private String title;
private float price;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
} public String toString() {
return JSON.toJSONString(this);
} public static Goods parseJson(String json) {
return JSON.parseObject(json, Goods.class);
}
}
Redis从基础命令到实战之字符串类型的更多相关文章
- Redis从基础命令到实战之集合类型(Set)
Redis集合类型的基础功能也是存储字符串列表,和列表类型的区别是字符串不能重复且没有顺序.当然,存储元素唯一性也可以通过应用程序保证,单从这一点上并没有体现出对比列表类型的特点. 其实,集合类型的一 ...
- Redis从基础命令到实战之列表类型(List)
经过上一篇基于Redis散列类型的改造后,实战练习中的商品管理已经具备了增加.修改整体.修改部分属性和分页查询功能,但仍然不支持删除商品的功能.这是因为商品总数是以一个自增数字记录的,且关联了新商品k ...
- Redis从基础命令到实战之散列类型(Hash)
从上一篇的实例中可以看出,用字符串类型存储对象有一些不足,在存储/读取时需要进行序列化/反序列化,即时只想修改一项内容,如价格,也必须修改整个键值.不仅增大开发的复杂度,也增加了不必要的性能开销. 一 ...
- Redis从基础命令到实战之有序集合类型(SortedSet)
有序集合类型是Redis五种数据类型中最高级的.也是最复杂的类型.有序集合具有集合类型的特性,在其基础上给每个元素关联了一个分值,或称为权重,操作时既可以在添加元素时指定分值,也可以单独修改集合中某一 ...
- Redis常用命令入门1:字符串类型命令
Redis总共有五种数据类型,在学习的时候,一定要开一个redis-cli程序,边看边练,提高效率. 一.最简单的命令 1.获得符合规则的键名列表 keys * 这里的*号,是指列出所有的键,同时*号 ...
- Redis命令拾遗一(字符串类型)
文章归博客园和作者“蜗牛”共同所有 .转载和爬虫请注明原文Redis系列链接 http://www.cnblogs.com/tdws/tag/NoSql/ Redis有五种基本数据类型.他们分别是字符 ...
- Redis 常用命令学习二:字符串类型命令
1.赋值与取值命令 127.0.0.1:6379> set foo helloredis OK 127.0.0.1:6379> get foo "helloredis" ...
- redis之基础命令
一.redis介绍 1.redis特性 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件 redis是c语言编写的,支持数据持久化,是key-val ...
- redis的基础命令操作
文章目录 前言 一.字符串类型 二.哈希类型 三.列表类型 四.集合类型 五.有序集合类型 六.通过命令 前言 redis的数据结构 redis存储的是key,value格式的数据,其中的key是字符 ...
随机推荐
- css3基础、(弹性、响应式)布局注意点
E1>E2选择父元素为E元素的所有E2元素(子类选择器) E1+E2选择元素为E1之后的所有E2元素(兄弟选择器) E[attr]只使用属性名,但没有确定任何属性值 E[attr="v ...
- c++智能指针实现方式1
#include<iostream> using namespace std; // 定义仅由HasPtr类使用的U_Ptr类,用于封装使用计数和相关指针 // 这个类的所有成员都是pri ...
- linux使用secureCRT连接(没有rsa的时候)
一台linux新机器,怎么使用secureCRT连接呢??? 首先 vim /etc/sysconfig/network-scripts/ifcfg-eth0 把BOOTPROTO=none I ...
- 黄聪:win7 QQ自动远程协助 提示关闭了远程桌面
最近在使用QQ自动远程协助的时候,输入完远程验证密码后,提示“关闭了远程桌面” 系统环境:win7 64位 问题描述:在使用QQ自动远程协助,对方QQ提示关闭了远程桌面. 解决办法:将2台电脑的时间调 ...
- HBase设计与开发性能优化(转)
本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法.有关HBase系统配置级别的优化,这里涉及的不多,这部分可以参考:淘宝Ken Wu同学的博客. 1. 表的设计 1.1 Pr ...
- 多个Python环境的构建:基于virtualenv 包
假如一台计算中安装多个Python版本,而不同版本可能会pip安装不同的包,为了避免混乱,可以使用virtualenv包隔离各个Python环境,实现一个Python版本对应一套开发环境. 本地概况: ...
- opencv2.4.9在ubuntu(树莓派)上安装
参考原文:https://my.oschina.net/u/1757926/blog/293976 1. 先从sourceforge上下载OpenCV的源码 http://jaist.dl.sourc ...
- lsyncd 实时同步
1. 几大实时同步工具比较 1.1 inotify + rsync 最近一直在寻求生产服务服务器上的同步替代方案,原先使用的是inotify + rsync,但随着文件数量的增大到100W+,目录下的 ...
- jQuery的编码标准和最佳实践
不知道在哪里看到了这篇关于jQuery编码的文章,挺实用的,恰好最近在研究jQuery的基础知识,今天打开收藏夹来翻译一下,原文的英语不难,但是内容很实用,可能有大神已经翻译过了,大家看精华就行了. ...
- Nhibernate对应关系参数介绍
一.多对一关联映配置介绍 <many-to-one name="PropertyName" 属性名 column="column_name" 数据库字段名 ...