Redis教程基础篇
Redis是非关系数据库的代表,因为官方不建议在Windows下使用Redis,所以并不提供Windows的支持,所以我们使用Linux来学习Redis的使用。
Redis的简介
Redis是Key-Value的非关系数据库,它有以下特点:
- 高速存取,110k次/s的读取和81k/s次的写入,这也是所有内存数据库的特点
- 支持数据持久化,可以把内存中的数据存放的磁盘里,下次启动再加载
- 提供多样化数据结构的支持,除了简单的key-value,还支持list、hash、set、sortSet的数据结构
- 单线程存取,所以不用同步、不会死锁、不用上下文切换,故而性能极高。
- 原子性操作,提供事务支持。
一个字,牛!接下来我们就来安装它。
下载源码并安装运行
首先找到你想要存放Redis的文件夹,我喜欢把软件全都放在Programe文件夹下:
- 先新建文件夹
$ mkdir Programe
再进入文件夹$ cd Programe
- 下载源码:
$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz
- 解压安装包:
$ tar xzf redis-5.0.5.tai.gz
- 进入解压后的文件夹
$ cd redis-5.0.5
- 编译:
$ make
这一步要等一会,编译要几分钟,喝杯茶吧
- 运行服务器
$ src/redis-serve --daemonize yes
注意daemonize参数代表是否以多线程方式启动,如果没有参数的话,就是默认是单线程,这样这一台机器只能开起服务器,不能运行客户端,只能通过网络连接别的客户端。
- 运行客户端
$ src/redis-cli
并输入PING看看是否连通
这样我们就开始运行了,接下来就具体的使用了
Redis的基本使用
redis 有五种数据类型 字符串、哈希表、链表、集合、有序集合
字符串
每个数据都有key和value,value是String类型,但是当它为全数字,在int范围内时,可以作为数字进行加减操作。
存入
> set key value
如果key存在会覆盖> setnx key value
key不存在才设置> mset key1 value1 key2 value2 ...
set的批处理> msetnx
同理
取出
> get key
取出对应的value,>mget key1 key2
同上> getrange key start end
取出对应value中从start到end的子串> getset key value
相当于get key
再set key value
> strlen key
可以获得value的长度
修改
> setrange key offset value
从offerset处开始用value覆盖,注意,是按字符覆盖,如果value长度小于(本来的长度-offset)那么后面的部分并不会改变(例子:先> set abc hello
再> setrange abc 0 H
最后>get abc
结果是"Hello"> append key value
追加字符- 如果value满足int,可以使用
incr|decr key
加1|减1incrby key n
可以给value加上n,n可正可负
提示:指令输入前缀(比如输入setra)之后按Tab键(setra就变成了SETRANGE)可以自动补全,多按几次就是按字典序往下翻,再也不用担心指令记不全了。
样例:(我故意不和指令的解释放在一起,就是为了让你第一次看的时候不轻松,自己动手操作一下或者脑补)
Key操作
在理解了key-value的存储方式后,讲一下针对key的操作
> exists key
查找key是否存在> del key
删除key> keys pattern
找到所有符合pattern(正则表达式)的key,> keys *
展示所有的key> rename key newname
改名
样例:
哈希表
相当于字符串类型的key部分是哈希表的一个对象名,这个哈希表可以存储很多个field-value,不同的哈希表对象不能相互访问,相当于字符串类型的套娃。
所以,哈希表类型的命令和字符串类型的命令很像
存入> hset key field value
取出> hget key field
相当于在原本的指令前加了一个h,然后在key指定哈希表的名字,field表示字段,value是字段的值
单独的指令
> hgetall key
获取哈希表中所有的字段名和字段值> hlen key
获取字段的数量> hval key
获取所有字段值> hkeys key
获取所有字段名
样例:
链表
容易理解key就是链表名,链表的命令和之前的有很大不同,链表的头用L(表示left),尾用R(表示right),再脑海里想象这是一个从左到右排列的链表就可以很容易理解它的操作了
存入:
> lpush key value1 value2 ...
按顺序将value一个个从头插入链表 rpush就是从尾插入> linser key befor|after 元素 value
将value插入到元素的前面或后面
取出:
> lpop key
将链表第一个元素返回并删除 rpop则是最后一个> lindex key index
根据索引获取元素的值> lrange key start stop
获取start-stop范围内的值,stop=-1表示获取start之后的所有值
修改删除:
> lset key index value
根据索引修改元素的值> lrem key count value
从左开始,删掉count个值为value的元素> ltrim key start end
保留start-stop范围内的元素,其他全删掉,stop=-1表示start之后所有值
样例:
集合
这个集合是无序集合,是通过哈希表实现的,增删查都是o(1),所以是不能有重复成员,一个集合最多可以储存2^32-1个成员(和int有什么关系呢?自己想想。
集合的命令如下:
sadd key member1 member 2 ...
添加成员,如果有重复会自动去重scard key
获取成员个数smembers key
获取所有成员,乱序sinter key1 key2 ...
获取集合的交集,sinterstore key0 key1 key2 ...
将交集存在key0集合里- 将上面那两条命令的"sinter"改成"sdiff"或者"sunion"就是求差和求并了
spop key count
随机取出count个成员并删除,不写默认为1srandmember key count
随机返回count的绝对值个成员,不写count返回一个srem key member1 member2 ...
删除给定的成员sismember key member
判断集合里面有没有member
样例:
有序集合
有序集合和集合的区别就在有序集合的每个成员绑定了一个score,集合就通过这个score来对成员进行排序,成员不允许重复,score允许重复,相同分数按字典序排序。命令有点像是list和set的杂交
有序集合的命令如下:
zadd key score1 member1 score2 member 2 ...
添加成员,如果有重复会更新scorezcard key
获取成员个数zcount key min max
分数区间内成员个数zlexcount key min max
所有成员分数相同时用两个成员名划定区间,返回成员个数。zscore key member
获取成员的分数zrank key member
获取成员的索引zrange key start stop [withscores]
获取索引start-stop范围内的成员,加上withscores选项,返回值和分数zrangebyscore key min max[withscore]
获取分数在min-max区间内的成员zrangebylex key min max
通过成员名获取zrevrange则是倒序zinterstore key0 keynums key1 key2 ...
求keynums个集合的交集并存在key0集合里,"zunionstore"就是求求并集,默认是将相同成员的score相加zpopmax key count
按分数高到低取出count个成员并删除,默认count=1,zpopmin key count
从低到高,同上。zrem key member1 member2 ...
删除给定的成员,类似有zrembyrank、zrembyscore、zermbylex,给定范围删除zincrby key n member
给member的score加上n
样例:
断开连接与关闭服务器
如果只是客户端不用了,要断开连接,输入quit即可。
如果要关闭服务器,在客户端输入shutdown save,关闭服务器并保存内存中的数据,然后quit关闭客户端。
用java编程连接redis
下载jedis.jar包,加入你的classpath,就可以使用了
import redis.clients.jedis.Jedis;
public Redisjava{
public static void main(String[] args){
String host="Redis服务器IP地址";
int port=服务器端口;
String password="Redis服务器密码";
//连接Redis服务器
Jedis redis=new Jedis(host,port);
redis.auth(password);
//redis就是客户端,redis.xxx(参数),xxx就是上面学到哪些命令
String value=redis.get("你要查询的key");
//用完记得关闭连接
jedis.close();
}
}
基础教程到这结束,我们就学会了通过命令行使用Redis数据库和编程使用数据库了,单客户端操作起来是没有问题的。