字符串类型是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从基础命令到实战之字符串类型的更多相关文章

  1. Redis从基础命令到实战之集合类型(Set)

    Redis集合类型的基础功能也是存储字符串列表,和列表类型的区别是字符串不能重复且没有顺序.当然,存储元素唯一性也可以通过应用程序保证,单从这一点上并没有体现出对比列表类型的特点. 其实,集合类型的一 ...

  2. Redis从基础命令到实战之列表类型(List)

    经过上一篇基于Redis散列类型的改造后,实战练习中的商品管理已经具备了增加.修改整体.修改部分属性和分页查询功能,但仍然不支持删除商品的功能.这是因为商品总数是以一个自增数字记录的,且关联了新商品k ...

  3. Redis从基础命令到实战之散列类型(Hash)

    从上一篇的实例中可以看出,用字符串类型存储对象有一些不足,在存储/读取时需要进行序列化/反序列化,即时只想修改一项内容,如价格,也必须修改整个键值.不仅增大开发的复杂度,也增加了不必要的性能开销. 一 ...

  4. Redis从基础命令到实战之有序集合类型(SortedSet)

    有序集合类型是Redis五种数据类型中最高级的.也是最复杂的类型.有序集合具有集合类型的特性,在其基础上给每个元素关联了一个分值,或称为权重,操作时既可以在添加元素时指定分值,也可以单独修改集合中某一 ...

  5. Redis常用命令入门1:字符串类型命令

    Redis总共有五种数据类型,在学习的时候,一定要开一个redis-cli程序,边看边练,提高效率. 一.最简单的命令 1.获得符合规则的键名列表 keys * 这里的*号,是指列出所有的键,同时*号 ...

  6. Redis命令拾遗一(字符串类型)

    文章归博客园和作者“蜗牛”共同所有 .转载和爬虫请注明原文Redis系列链接 http://www.cnblogs.com/tdws/tag/NoSql/ Redis有五种基本数据类型.他们分别是字符 ...

  7. Redis 常用命令学习二:字符串类型命令

    1.赋值与取值命令 127.0.0.1:6379> set foo helloredis OK 127.0.0.1:6379> get foo "helloredis" ...

  8. redis之基础命令

    一.redis介绍 1.redis特性 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件 redis是c语言编写的,支持数据持久化,是key-val ...

  9. redis的基础命令操作

    文章目录 前言 一.字符串类型 二.哈希类型 三.列表类型 四.集合类型 五.有序集合类型 六.通过命令 前言 redis的数据结构 redis存储的是key,value格式的数据,其中的key是字符 ...

随机推荐

  1. Zedboard安装桌面系统ubuntu及opencv(1)

    最近一直在搞板子,想帮Zedboard安装一个opencv谁知道困难重重,而且网络几乎没有任何资料可以参考,只有陆佳华的<嵌入式软硬件协同设计实战指南>可以参考. 但是这本书讲得不清不楚, ...

  2. 【原】运动版的轮播图,有左右按钮和单独分页,原生JS版

    运动版的轮播图,有左右按钮和单独分页 这个例子重点在于: 运动框架的复习,要灵活运动回调函数 始终以全局变量iNum来控制oUl的移动目的地,每次有任何动作,都是先判断iNum并改变iNum后去调用运 ...

  3. ASP.NET管道

    以IIS 6.0为例,在工作进程w3wp.exe中,利用Aspnet_ispai.dll加载.NET运行时(如果.NET运行时尚未加载).IIS 6引入了应用程序池的概念,一个工作进程对应着一个应用程 ...

  4. 表在用时建索引要加ONLINE

    因为: 源地址:https://zhidao.baidu.com/question/585392982737434725.html 一般建立索引会引起锁表,不允许进行数据更新等DML操作: 如果建立索 ...

  5. linux 学习干货

    学习了第七章. 每一个键盘对应一个信号.主要的有: ^代表 Ctrl <Backspance> erase ,删除一个字符. ^W werase,删除一个单词 ^U / ^X kill , ...

  6. 函数指针_typedef

    一 函数指针 1 函数类型 函数的类型由它的返回值类型,和形参类型共通过决定,与函数名无关. eg:bool lengthcompare(const string&, const string ...

  7. [转载]《民航科技》2012年4月专家论坛:程延松《关于中国民航SWIM框架及技术实现探讨》

    专家介绍:程延松,现任成都民航空管发展有限公司总经理,理学博士,高级工程师,长期从事空管技术研究和产品研发工作,作为课题负责人,参与了国家863计划.国家科技支撑计划.国家空管委重点课题.民航局重点课 ...

  8. 【VB6】vbRichClient5.cWebServer实现一个简单web服务器

    Option Explicit Private WithEvents k As vbRichClient5.cWebServer Private Sub Command1_Click() Set k ...

  9. web 音频文件自动播放(兼容所有浏览器)

    function AudioPerform() { var ua = navigator.userAgent.toLowerCase(); var audiopath = "$!{Templ ...

  10. 再见OI

    NOIP2016终章 自己弱还脑残加手残 再见OI 你好高考 你好明天 "没有泪水的日子会轻松很多 但我的心还是会痛" ------------------------------ ...