字符串类型是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. TinyHTTP代码核心流程

    TinyHTTPd是一个超轻量型Http Server,使用C语言开发,全部代码不到600行 研究HTTP服务器,为了更好的造轮子,看了TinyHTTPd代码,对逻辑处理画个简单流程图(不含底层)

  2. MySQL服务 - MySQL列类型、SQL模式、数据字典

    MySQL列类型的作用: 列类型可以简单理解为用来对用户往列种存储数据时做某种范围"限定",它可以定义数据的有效值(字符.数字等).所能占据的最大存储空间.字符长度(定长或变长). ...

  3. Mesos

    1. 软件定义数据中心 Mesos的二级调度机制: maseos协调每个节点的slave,获取每个节点的机器资源.获取资源后,在相应节点运行framework,在容器中执行任务.从而使得多种类型的服务 ...

  4. Actionscript Flash Event.ENTER_FRAME 延迟间隔非常大 并且 pre-render 耗时非常严重

    我遇到的问题是代码中不断的添加一个图标到舞台上,而且这个图标非常小,所以从内存也看不出什么问题. 但是由于舞台物件太多了,并且不断添加,导致渲染耗时严重. 而且这种错误,开发工具并不会报错,也不属于死 ...

  5. Laravel学习笔记(四)数据库 数据库迁移案例

    创建迁移 首先,让我们创建一个MySql数据库“Laravel_db”.接下来打开app/config目录下的database.php文件.请确保default键值是mysql: return arr ...

  6. ngrok 配置

    安装git 1.安装git,我安装的是2.6版本,防止会出现另一个错误,安装git所需要的依赖包 yum -y install zlib-devel openssl-devel perl hg cpi ...

  7. hibernate配置文件hibernate.cfg.xml的详细解释

    <!--标准的XML文件的起始行,version='1.0'表明XML的版本,encoding='gb2312'表明XML文件的编码方式-->                 <?x ...

  8. 对象布局已知时 C++ 对象指针的转换时地址调整

    在我调试和研究 netscape 系浏览器插件开发时,注意到了这个问题.即,在对象布局已知(即对象之间具有继承关系)时,不同类型对象的指针进行转换(不管是隐式的从下向上转换,还是强制的从上到下转换)时 ...

  9. Coretext实现图文混排及Gif图片播放

    CoreText是iOS3.2推出的一套文字排版和渲染框架,可以实现图文混排,富文本显示等效果. CoreText中的几个重要的概念:  CTFont CTFontCollection CTFontD ...

  10. IIS 7 中设置文件上传大小的方法

    在IIS 6.0中设置文件上传大小的方法,就是配置如下节点: <system.web> <httpRuntime maxRequestLength="1918200&quo ...