文档章节

redis命令及对应jedis操作(一)-String类型

laoyao
 laoyao
发布于 2014/07/26 14:40
字数 2350
阅读 1094
收藏 23

我们知道学习编程知识,先要搭建环境,首先需要下载redis工具包,下载时需要注意,redis的偶数版是表示稳定版(2.4,2.6等),奇数版表示非稳定版(2.5,2.7等),我下载的是2.6的,最新版本,我以前使用的是2.0版本的,发现好多命令不能使用,大家还是下载最新的稳定版比较好。

一、环境搭建:

      1、下载redis的压缩包,http://www.redis.io/(redis官网),下载好后解压下,然后配置环境变量,将redis-cli和redis-server所在地址配置在path中即可,因为是入门,我们只需要压缩包中的两个应用程序redis-cli.exe和redis-server.exe,打开redis-server.exe,这个就是redis服务器,服务器开启后是如下界面: 

打开redis客户端可以使用两种方式

1、打开cmd,输入命令:redis-cli -h 127.0.0.1,点击enter就可以了,然后输入ping命令测试,返回pong表示连接服务成功

2、直接打开redis-cli.exe,测试是否连接成功方式同上; 如图:


接下来就可以使用redis命令了,redis中包含五中类型,(string,list,set,sortedset,hash)这票博客中只描述String类型,也是redis中最简单的类型:

========

1、字符串类型是redis中最基本的数据类型,可以存储任何形式的字符串,包括二进制数据,一个字符串类型健允许存储的最大容量是512M,字符串是其他几种数据类型的基础,只是对字符串的组织形式不一样罢了,比如列表是以列表的形式组织的字符串,集合是以集合的形式组织的字符串。

2、常用的字符串命令:

set key value:给key赋值

get key :取出key对应的值

incr key :给key的值加1,如果key对应的值是字符串,会报错(ERR value is not an integer or out of range),返回的是增加后的值,若key不存在,则默认key对应的值由0开始增加,相当于创建了set key 0

incrby key num:给key对应的值增加num,num为指定增加的数值

decr key:与incr key相反

decrby key num:与incrby key num相反

mset k1 v1 k2 v2 k3 v3:同时给k1,k2,k3赋值

mget k1 k2 k3:同时取出k1,k2,k3的值

下面是上面的命令在redis命令端的结果:

redis 127.0.0.1:6379> set name jack
OK
redis 127.0.0.1:6379> get name
"jack"
redis 127.0.0.1:6379> incr num
(integer) 1
redis 127.0.0.1:6379> incr num
(integer) 2
redis 127.0.0.1:6379> get num
"2"
redis 127.0.0.1:6379> incrby num 5
(integer) 7
redis 127.0.0.1:6379> get num
"7"
redis 127.0.0.1:6379> decr num
(integer) 6
redis 127.0.0.1:6379> get num
"6"
redis 127.0.0.1:6379> mset stu1 zhangsan stu2 lisi stu3 wangwu
OK
redis 127.0.0.1:6379> mget stu1 stu2 stu3
1) "zhangsan"
2) "lisi"
3) "wangwu"

当然,redis针对string类型的命令还有很多,我就不全部在命令端敲出来了,可以贴出来给大家看看:

删除redis:del name                             返回删除key数量
测试指定key是否存在:exists name       1-存在,0-不存在
type key:返回key 的类型;string,list,hash,set,sortedset
keyspattern:匹配key,比如keys n*   ->name
randomkey:随机返回库中 的一个key
raname oldkey newkey  重命名key,如果key存在,覆盖
renamenx oldkey newkey  重命名key,如果key存在,返回失败
dbsize 返回key的数量
expire key seconds :为可以设置过期时间,单位秒,返回1表成功,0表示已经设置过或者key不存在
ttl key  返回设置过过期时间的 key的剩余过期秒数  -1 表示 key不存在或者没有设置过过期时间
select db-index 通过索引选择数据库,默认连接的数据库所有是0,默认数据库数是 16个。返回1 表
示成功,0 失败 
move key db-index   将 key从当前数据库移动到指定数据库。返回1 成功。0 如果key不存在,或
者已经在指定数据库中 
flushdb  删除当前数据库中所有 key,此方法不会失败。慎用 
flushall  删除所有数据库中的所有key,此方法不会失败。更加慎用
append key value 给指定key的字符串值追加 value,返回新字符串值的长度。 
substr key start end  返回截取过的 key的字符串值,注意并不修改 key的值,下标是从 0 开始的。

根据需要自己来使用响应的命令即可。

redis也支持很多的程序语言,发展速度很快,我这边示例java程序对redis的操作,也只贴出对string类型的操作:我使用的jedis的jar包是jedis-2.1.0.jar,当然程序中还需要别的jar包,大家可以根据我程序中import中的内容去网上下载

package org.laoyao.redisTest;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;
import redis.clients.jedis.SortingParams;

public class RedisTest {
    private Jedis jedis;// 非切片额客户端连接
    private JedisPool jedisPool;// 非切片连接池
    private ShardedJedis shardedJedis;// 切片额客户端连接
    private ShardedJedisPool shardedJedisPool;// 切片连接池

    public RedisTest() {
        initialPool();
        initialShardedPool();
        shardedJedis = shardedJedisPool.getResource();
        jedis = jedisPool.getResource();

    }

    /**
     * 初始化非切片池
     */
    private void initialPool() {
        // 池基本配置
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxActive(20);
        config.setMaxIdle(5);
        config.setMaxWait(1000l);
        config.setTestOnBorrow(false);

        jedisPool = new JedisPool(config, "127.0.0.1", 6379);
    }
    /**
     * 初始化切片池
     */
    private void initialShardedPool() {
        // 池基本配置
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxActive(20);
        config.setMaxIdle(5);
        config.setMaxWait(1000l);
        config.setTestOnBorrow(false);
        // slave链接
        List shards = new ArrayList();
        shards.add(new JedisShardInfo("10.22.19.167", 6379, "master"));

        // 构造池
        shardedJedisPool = new ShardedJedisPool(config, shards);
    }
    private void StringOperate() {
        System.out.println("======================String_1==========================");
        // 清空数据
        System.out.println("清空库中所有数据:" + jedis.flushDB());

        System.out.println("=============增=============");
        jedis.set("key001", "value001");
        jedis.set("key002", "value002");
        jedis.set("key003", "value003");
        System.out.println("已新增的3个键值对如下:");
        System.out.println(jedis.get("key001"));
        System.out.println(jedis.get("key002"));
        System.out.println(jedis.get("key003"));

        System.out.println("=============删=============");
        System.out.println("删除key003键值对:" + jedis.del("key003"));
        System.out.println("获取key003键对应的值:" + jedis.get("key003"));

        System.out.println("=============改=============");
        // 1、直接覆盖原来的数据
        System.out.println("直接覆盖key001原来的数据:" + jedis.set("key001", "value001-update"));
        System.out.println("获取key001对应的新值:" + jedis.get("key001"));
        // 2、直接覆盖原来的数据
        System.out.println("在key002原来值后面追加:" + jedis.append("key002", "+appendString"));
        System.out.println("获取key002对应的新值" + jedis.get("key002"));

        System.out.println("=============增,删,查(多个)=============");
        /**
         * mset,mget同时新增,修改,查询多个键值对 等价于: jedis.set("name","ssss"); jedis.set("jarorwar","xxxx");
         */
        System.out.println("一次性新增key201,key202,key203,key204及其对应值:"
                + jedis.mset("key201", "value201", "key202", "value202", "key203", "value203", "key204", "value204"));
        System.out.println("一次性获取key201,key202,key203,key204各自对应的值:"
                + jedis.mget("key201", "key202", "key203", "key204"));
        System.out.println("一次性删除key201,key202:" + jedis.del(new String[] { "key201", "key202" }));
        System.out.println("一次性获取key201,key202,key203,key204各自对应的值:"
                + jedis.mget("key201", "key202", "key203", "key204"));
        System.out.println();

        // jedis具备的功能shardedJedis中也可直接使用,下面测试一些前面没用过的方法
        System.out.println("======================String_2==========================");
        // 清空数据
        System.out.println("清空库中所有数据:" + jedis.flushDB());

        System.out.println("=============新增键值对时防止覆盖原先值=============");
        System.out.println("原先key301不存在时,新增key301:" + shardedJedis.setnx("key301", "value301"));
        System.out.println("原先key302不存在时,新增key302:" + shardedJedis.setnx("key302", "value302"));
        System.out.println("当key302存在时,尝试新增key302:" + shardedJedis.setnx("key302", "value302_new"));
        System.out.println("获取key301对应的值:" + shardedJedis.get("key301"));
        System.out.println("获取key302对应的值:" + shardedJedis.get("key302"));

        System.out.println("=============超过有效期键值对被删除=============");
        // 设置key的有效期,并存储数据
        System.out.println("新增key303,并指定过期时间为2秒" + shardedJedis.setex("key303", 2, "key303-2second"));
        System.out.println("获取key303对应的值:" + shardedJedis.get("key303"));
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
        }
        System.out.println("3秒之后,获取key303对应的值:" + shardedJedis.get("key303"));

        System.out.println("=============获取原值,更新为新值一步完成=============");
        System.out.println("key302原值:" + shardedJedis.getSet("key302", "value302-after-getset"));
        System.out.println("key302新值:" + shardedJedis.get("key302"));

        System.out.println("=============获取子串=============");
        System.out.println("获取key302对应值中的子串:" + shardedJedis.getrange("key302", 5, 7));
    }

    
    public static void main(String[] args) {
        new RedisTest().StringOperate();
    }
}

下面贴出运行结果:

======================String_1==========================
清空库中所有数据:OK
=============增=============
已新增的3个键值对如下:
value001
value002
value003
=============删=============
删除key003键值对:1
获取key003键对应的值:null
=============改=============
直接覆盖key001原来的数据:OK
获取key001对应的新值:value001-update
在key002原来值后面追加:21
获取key002对应的新值value002+appendString
=============增,删,查(多个)=============
一次性新增key201,key202,key203,key204及其对应值:OK
一次性获取key201,key202,key203,key204各自对应的值:[value201, value202, value203, value204]
一次性删除key201,key202:2
一次性获取key201,key202,key203,key204各自对应的值:[null, null, value203, value204]

======================String_2==========================
清空库中所有数据:OK
=============新增键值对时防止覆盖原先值=============
原先key301不存在时,新增key301:1
原先key302不存在时,新增key302:1
当key302存在时,尝试新增key302:0
获取key301对应的值:value301
获取key302对应的值:value302
=============超过有效期键值对被删除=============
新增key303,并指定过期时间为2秒OK
获取key303对应的值:key303-2second
3秒之后,获取key303对应的值:null
=============获取原值,更新为新值一步完成=============
key302原值:value302
key302新值:value302-after-getset
=============获取子串=============
获取key302对应值中的子串:302

总结:redis对string类型的操作是非常简单的,redis本来就是一个简单的东西,string类型是其余各种类型的基础,其余各种类型(list、set、sortedset、hash)最终保存的依然是string类型的值,今天就写这么多,刚开始学习,算是学习笔记吧,写的不好,还请多多包涵指正!

© 著作权归作者所有

laoyao
粉丝 7
博文 22
码字总数 28605
作品 0
芜湖
程序员
私信 提问
加载中

评论(3)

laoyao
laoyao 博主

引用来自“newnoder”的评论

redis做缓存不错
的确是不错,速度很快,每次访问5ms左右吧
n
newnoder
redis做缓存不错
jsh13579
jsh13579
redis
Redis中RedisTemplate和Redisson管道的使用

当对Redis进行高频次的命令发送时,由于网络IO的原因,会耗去大量的时间。所以Redis提供了管道技术,就是将命令一次性批量的发送给Redis,从而减少IO。 一、Jedis对redis的管道进行操作 1、获...

宇的季节
2018/03/22
0
0
redis的各种数据类型

redis的各种数据类型 redis的数据类型有好集中,例如:string,hash,list,set,sort set,sub/pub。每一中在网络中都有大量的应用场景。结合jedis来讲解这些数据类型的使用方式和场景。 1、...

GITTODO
2016/02/29
155
0
redis 安装和简单使用

一、redis 安装 1、首先安装c的编译环境 yum -y install cpp yum -y install binutils yum -y install glibc yum -y install glibc-kernheaders yum -y install glibc-common yum -y instal......

xiaozhou18
2016/12/08
44
0
Jedis 与 ShardedJedis 设计

Jedis设计 Jedis作为推荐的java语言redis客户端,其抽象封装为三部分: 对象池设计:Pool,JedisPool,GenericObjectPool,BasePoolableObjectFactory,JedisFactory 面向用户的redis操作封装...

tantexian
2016/06/07
105
0
Java实现Redis发布/订阅

今天经理让我实现一个Redis发布/订阅功能,用来记录审计信息。我查了一天,才弄出来。总结如下,大神勿喷。 客户端1订阅bar频道。格式:SUBSCRIBE name1 name2。成功订阅回复,分别对应订阅类...

问题达人
2016/03/29
264
0

没有更多内容

加载失败,请刷新页面

加载更多

最好的重试是指数后退和抖动

1. 概述 在本教程中,我们将探讨如何使用两种不同的策略改进客户端重试:指数后退和抖动。 2. 重试 在分布式系统中,多个组件之间的网络通信随时可能发生故障。 客户端应用程序通过实现重试来...

liululee
26分钟前
4
0
聊一聊大厂内部的安全管理机制

工作了两个月了体会到了很多之前做外包小项目没有的东西,不得不说大厂的还是有自己一套的完善的体制,不会像B站那样泄露自己整个后台的源码这种事情发生。 电脑办公 比如说在使用电脑办公这...

gzc426
54分钟前
4
0
如何利用deeplearning4j中datavec对图像进行处理

NativeImageLoader Labelloader = new NativeImageLoader(112, 112, 3,new FlipImageTransform(-1)); 一、导读 众所周知图像是有红绿蓝三种颜色堆叠而成,利用deeplearning对图像处理,必须把...

冷血狂魔
55分钟前
8
0
1. Context - React跨组件访问数据的利器

《react-router-dom源码揭秘》系列 2. React-Router的基本使用 3. react-router-dom源码揭秘 - BrowserRouter Context提供了一种跨组件访问数据的方法。它无需在组件树间逐层传递属性,也可以...

前端老手
今天
6
0
Docker入门实战--开篇,为什么要使用Docker

前面Thrift文章中,我曾经介绍过我为什么要用Thrift。Docker的使用却是不一样的。纯属没事找事,因为我现在一个人的团队,项目只要一个project目录足够了! 那我何苦要用Docker呢 各位且听听...

后天的奇点
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部