您的位置:首页 > 数据库 > Redis

redis 基本命令,6种基本value类型

2017-03-28 23:25 423 查看
Redis是一种面向“键/值”对数据类型的内存数据库,可以满足我们对海量数据的读写需求。
redis的键只能是字符串
redis的值支持多种数据类型:

1:字符串string

2:哈希hash

3:字符串列表list

4:字符串集合set 不重复,无序

5:有序集合sortedset ,不重复,有序

6:HyperLogLog结构(redis2.8.9版本之后才有,用来做基数统计的算法。)

redis 官网

www.redis.io

redis中文官网

www.redis.cn

下载redis安装包,3.0才开始支持redis分布式

安装redis,解压后再redis目录下执行:

1.make

2.make install src目录下会把一些可执行文件copy到/usr/local/bin目录下

启动redis

redis-server

修改redis.conf

默认后台 方式启动redis

daemonize yes

日志目录

logfile "/usr/local/redis-3.0.0/logs"

启动可以选择配置文件

redis-server /etc/redis.conf

ps -ef |grep redis

redis-cli客户端

redis客户端也可以设置,

连接哪台机器哪个端口的redis,如果不设置ip和端口,默认启动本机6379的redis

端口也可以在配置文件里改

redis-cli -h 127.0.0.0 -p 6379

停止redis

redis-cli 下执行 shutdown命令

redis-cli shutdown

redis有多个数据库

默认进入0号数据库

redis默认有16个数据库(0-15)

进入15号数据库

select 15

redis.conf可以配置数据库个数

databases 16

redis数据库名称就是数字,不支持自定义数据库名字

数据库的操作是隔离的,一个命令除外:flushall

flushall清空redis所有数据库实例中的数据

通用命令

获取所有的key

redis-cli keys "*"

获取以name开头的所有key

redis-cli del `redis-cli keys "name*"`

获取 crxy的类型

type crxy

判断某个key是否存在

exists key

redis不区分大小写

redis班助命令

help @String 所有String类型的操作帮助

help @Sorted_set

获取set命令使用方法

help set

help s+Tab 自动补全s开头的目录

1.value为String类型

set是操作string数据类型的命令

设置一个值

set crxy www.crxy.cn

设置多个值

mset crxy1 aaa crxy2 bbbb

获取1个值

get crxy

获取多个值

mget crxy crxy2

如果建存在,则插入不成功,如果建不存在,则插入成功

setnx crxy 221222

值递增加1,值必须可以转换为数字

incr crxy

递减,值必须可以转换为数字

decr crxy

设置步长,每次递增加3

incrby crxy 3

incrbyfloat crxy 2.1

incrbyfloat crxy -2.1

没有decrbyfloat

拼接字符串

append crxy aaa

返回长度

strlen crxy

2.hash(相对于hashmap)

key ->value(这个value是hashmap类型的数据,这个hashmap的key和value 都是字符串)

value存储的是hashmap的字段,value的key和值都只能是字符串

适用于存储对象

比如user

user->{id:1,name:xiaoli,age:1}

动态增加删除列

id name age gender

增加一个

user:100是key

hset user:100 name zs

hset user:100 age 18

获取key为user:100的name属性的值

hget user:100 name

增加多个

hmset user:100 name xiaolii gender 0

如果建存在则不操作,如果不存在则插入

hsetnx user:100 name wangsi

判断建中是否存在某个属性

hexists user:100 city

hmget user:100 age gender

删除某个字段

hdel user:100 city

获取所有value

hvals user:100

获取所有key

hkeys user:100

长度

hlen user:100

3.value类型是list

从左边插入

lpush list a

lpush list a b c d e f

从右侧插入

rpush list b

从左侧弹出一个元素

lpost list

从右侧弹出一个元素

rpost list

获取长度

llen list

rlem list 2 a

lrem(lrem key count value)count分为三种情况

count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。

count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。

count = 0 : 移除表中所有与 value 相等的值。

角标区间,-1倒数第一个,-2倒数第二个,(角标并不存在-1,-2,只是命令做了转换)

lrange list 0 -1

元素:a b c d

角标 :0 1 2 3

修改0号角标的元素为a

lset list 0 a

4.value类型是Set

添加元素

sadd set a

sadd set b

删除元素

srem set a b

集合set中是否存在元素a

sismembers set a

集合中的所有元素

smembers set

返回差值,返回set中有而set1中没有的元素

sdiff set set1

求连个set的交集

sinter set set1

并集,两个元素中

sunion set set1

将set和set1的并集存储在aaa中

sunionstore aaa set set1

type aaa

smembers aaa

返回元素个数

scard aaaa

随机取数据,取完就删了

spop set

随机取几个元素(个数是正数,返回小于等于集合长度的元素,如果个数是负数,返回负数绝对值个的元素,不保证元素不重复)

srandmember set 2

5.value的类型是sortedSet

10是分值

zadd zset 10 a

获取元素分值

zscore zset a

获取某个区间元素

zrange zset 0 -1

zrange zset 0 1

反序返回所有元素

zrevrange zset 0 -1

通过分值获取元素,默认是闭区间[10,20]

zrangebyscore zset 10 20

加小括号就是开区间 (10,20)

zrangebyscore zset (10 (20

递增

zincrby zset a 1

返回元素个数

zcard zset

指分数定区间元素个数(闭区间)

zcount zset 10 20

zcount zset (10 20

移除指定元素

zrem zset a

通过角标删除元素

zremrangebyrank zset 0 1

通过分数删除元素

zremrangebyscore zset 10 20

开区间

zremrangebyscore zset (10 (20

正无穷

zadd zset +inf x

负无穷

zadd zset -inf y

如果两个元素的分值相同,则按照元素的自然顺序排序

例子:学生id和成绩

key score:1 value:90

set score:1 90

set score:2 100

set score:3 80

set score:4 70

排序

根据学生的成绩排序:

*是通配符

sort list by score:*

4

3

1

2

根据成绩排序

sort list by score:* desc 降序排序

2

1

3

4

get # 表示获取元素本身

sort list by score:* get # get score:* desc

2

100

1

90

3

80

4

70

sort list 对hashset排序

hset stu:1 id 1

hset stu:1 name name1

hset stu:1 score 60

hset stu:2 id 2

hset stu:2 name name2

hset stu:2 score 50

hset stu:3 id 3

hset stu:3 name name3

hset stu:3 score 80

hset stu:4 id 4

hset stu:4 name name4

sort list by stu.*->score
4
2
1
3

因为stu:4没有score这个参考键,默认是0

同时查询出姓名
sort list by stu:*->score get # get stu:*->name

如果分数相同,则按照id排序,stu:1 表示id为1的学生

set命令权限很大,set本来是String类型的操作命令,如果操作其他类型的数据,其他数据都会转换为String类型

Jedis编程

添加Jedis的maven依赖

测试

Jedis jedis = new Jedis(host, port);

生产

private static JedisPool jedisPool=null;

public Jedis getJedis(){

if(JedisPool==null){

JedisPoolConfig poolConfig = new JedisPoolConfig();

poolConfig.setMaxTotal(100);//总连接数

poolConfig.setMaxIdle(10);//空闲链接数

poolConfig.setMaxWaitMillis(3000);//创建连接的超时时间

poolConfig.setTestOnBorrow(true);//在创建连接的时候是否会测试,保证创建的连接一定是可用的

JedisPool jedisPool = new JedisPool(poolConfig, host, port);

}|

Jedis jedis = jedisPool.getResource();

return jedis;

}

public void returnJedis(Jedis jedis){

jedisPool.returnResourceObject(jedis);

}

@Test

public void test1(){

Jedis jedis=getJedis();

String string = jedis.get("crxy");

System.out.println(string);

}

redis每个操作都是原子操作,保证线程安全

事务:

redis中的事务是一组命令的集合。事务同命令一样都是redis的最小执行单元。一组事务中的命令要么都执行,要么都不执行。(例如:转账)
原理:先将属于一个事务的命令发送给redis进行缓存,最后再让redis依次执行这些命令。
应用场景
一组命令必须同时都执行,或者都不执行。
我们想要保证一组命令在执行的过程之中不被其它命令插入。
命令
multi 事务开始
.....
exec 事务结束,开始执行事务中的命令
discard 放弃事务
错误处理
1:语法错误:致命的错误,事务中的所有命令都不会执行
2:运行错误:不会影响事务中其他命令的执行
Redis 不支持回滚(roll back)
正因为redis不支持回滚功能,才使得redis在事务上可以保持简洁和快速。
java代码手工实现incr递增命令
watch命令
作用:监控一个或者多个键,当被监控的键值被修改后阻止之后的一个事务的执行。
但是不能保证其它客户端不修改这一键值,所以我们需要在事务执行失败后重新执行事务中的命令。
注意:执行完事务的exec命令之后,watch就会取消对所有键值的监控
unwatch:取消监控
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: