当前访客身份:游客 [ 登录  | 注册加入尚学堂]
启用新域名sxt.cn
新闻资讯

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

helloworld 发表于 2年前  | 评论(0 )| 阅读次数(3337 )|   0 人收藏此文章,   我要收藏
摘要 redis全称是:REMOTE DICTIONARY SERVER,远程字典服务,它是以字典结构存储数据,并允许其他应用通过TCP协议读写字典中的内容。因为是内存读取,redis每秒可以读取数十万的健值数据。
们知道学习编程知识,先要搭建环境,首先需要下载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类型的值,今天就写这么多,刚开始学习,算是学习笔记吧,写的不好,还 请多多包涵指正!

分享到:0
关注微信,跟着我们扩展技术视野。每天推送IT新技术文章,每周聚焦一门新技术。微信二维码如下:
微信公众账号:尚学堂(微信号:bjsxt-java)
声明:博客文章版权属于原创作者,受法律保护。如果侵犯了您的权利,请联系管理员,我们将及时删除!
(邮箱:webmaster#sxt.cn(#换为@))
北京总部地址:北京市海淀区西三旗桥东建材城西路85号神州科技园B座三层尚学堂 咨询电话:400-009-1906 010-56233821
Copyright 2007-2015 北京尚学堂科技有限公司 京ICP备13018289号-1 京公网安备11010802015183