版权声明:本文为作者原创书籍。转载请注明作者和出处,未经授权,严禁私自转载,侵权必究!!!
前言篇
1. NoSql概述
为什么需要 NOSQL?
◆ High performance-高并发读写。
◆ Huge Storage-海量数据的高效率存储和访问。
◆ High Scalability&& High Availability-高可扩展性和高可用性。
主流NoSQL产品:
NOSQL数据库的四大分类:
◆键值(Key-Value)存储
◆列存储
◆文档数据库
◆图形数据库
NoSql的特点:
◆易扩展
◆大数据量,高性能
◆灵活的数据模型
◆高可用
Redis概述
高性能键值对数据库支持的键值数据类型:
◆字符串类型
◆散列类型
◆列表类型
◆集合类型
◆有序集合类型
Redis的应用场景:
◆缓存
◆任务队列
◆应用排行榜
◆网站访问统计
◆数据过期处理
◆分布式集群架构中的 Session分离
配置篇
2.安装环境
redis是C语言开发,安装redis需要先将下载的源码进行编译,依赖gcc环境。
如果没有gcc环境,要安装gcc:指令:yun install gcc-c++
如果提示是否下载,输入y下载
2.1下载并安装:
(1)下载: wget http://download.redis.io/releases/redis-3.0.7.tar.gz (下载你喜欢的版本)
(2) 解压缩:tar -zxzf redis-3.0.7.tar.gz(注意你的版本名称)
(3) cd redis-3.0.7
默认路径执行:sudo make&make install
指定到其他路径:make完后 执行 make PREFIX=/usr/local/redis install,然后将 cp redis.conf /usr/local/redis也复制到该目录下
切换到 redis/src 目录下可以查看到redis服务程序redis-server,还有用于测试的客户端程序redis-cli
启动redis服务: ./redis-server
注意:这种方式启动redis称为前端启动 使用的是默认配置,将不能接受linux命令,需要 ctrl+c停止后方可。
我们需要后端启动:修改redis.conf 将daemonize 修改为 yes
保存退出:wq
通过启动参数告诉redis使用指定配置文件使用下面命令启动。
进入src执行 ./redis-server ../redis.conf
这种方式启动不会影响你操作其他指令。
ps -ef | grep redis 查看是否启动
root 7696 1 0 16:12 ?00:00:00 ./redis-server *:6379
root 7726 3823 0 16:12 pts/000:00:00 grep redis
关闭指令:在src目录下执行 ./redis-cli shutdown
即可,或者:kill -9 任务进程号
启动redis服务进程后,就可以使用测试客户端程序redis-cli和redis服务交互了。 比如:
$ ./redis-cli
redis> set name zzh
OK
redis> get name
"zzh"
3.Jedis介绍
◆ Jedis是 Reids官方首选的Java客户端开发包。
◆ 下载地址:https://github.com/xetorthio/jedis
(1) 连接验证:在工程中加入下载好的jedis的jar包,如果是Maven项目可以直接在pom.xml中加入jedis包驱动 如:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.0.1</version>
</dependency>
(2) 测试代码:
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class Tests {
public static void main(String args[]){
testSingle();
testPool();
}
//单实例的测
public static void testSingle() {
//1,设置IP地址和口
Jedis jedis = new Jedis("192.168.11.133", 6379);
//2.保存数据:
jedis.set("name", "zzh");
//3,获取数据
String value = jedis.get("name");
System.out.println(value);
//4,释放资源
jedis.close();
}
//连接池的测
public static void testPool() {
//获得连接池的配图对象:
JedisPoolConfig config = new JedisPoolConfig();
//设置最大连接数
config.setMaxTotal(30);
//设最大空闲连接数:
config.setMaxIdle(10);
//获得连接池
JedisPool jedispool = new JedisPool(config, "192.168.11.133", 6379);
//获得核心对象
Jedis jedis = null;
try {
//通过连接池获得连接:
jedis = jedispool.getResource();
//设置数据
jedis.set("name", "郑再红");
//获取数据:
String value = jedis.get("name");
System.out.println(value);
} catch (Exception e) {
e.printStackTrace();
} finally {
if(jedis!=null){
jedis.close();
}
if(jedispool!=null){
jedispool.close();
}
}
}
}
结果如下:
注: 运行提示错误:redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused: connect 则需要配置端口防火墙
执行:vim /etc/sysconfig/iptables
添加一行你ps -ef | grep redis 查询后的redis端口号,如:
保存退出:执行service iptables restart
重启防火墙,再次运行程序即可的到结果。
语法篇
4.Redis的数据结构
五种数据类型:
◆字符串(String)
◆哈希(hash)
◆字符串列表(list)
◆字符串集合(set)
◆有序字符串集合(sorted set)
4.1 存储 String
◆二进制存储安全的,存入和获取的数据相同
◆ Value最多可以容纳的数据长度是512M
操作与运算:
(1)添加key并设置值: set
key value;
(2)通过key获取值: get
key;
(3)查看所有的key:keys *
;
(4)删除key和内容:del
key;
(5)数字类型字符串加一:incr
num;
(6)数字类型字符串减一:decr
num;
(7)获取范围值:getrange
如键 hello的值是 word,则 getrange 0 2 则返回 wor 字符串
(8)设置值前先获得值:getset
如键 a 的值是 hello 则 getset a word 返回hello 的值,实际键a值修改为word 了。
扩展命令:
(7) incrby
num 5 (意思->num=num+5)
(8) decrby
num 5 (意思->num = num-5)
注:如果有num字段 则在在num进行增减,如果没有会自动初始化num=0
(9) 拼接:append
num 5 (意思->num = num+"5",假如 num=2,则结果为:"25") 注:该条命令,如果num不存在,则将"5" 赋值给num,即:num="5"
4.2存储Hash
◆String Key和String Value的map容器
◆每一个Hash可以存储4294967295个键值对
操作与运算:
(1)添加key并设置值: hset/hmset
mapname key value;
注:hmset表示一次添加多个key ,value
例:
hset myhash username zhengzaihong //添加一个key 和value
hmset myhash2 username liuqi age 22 //同时添加多个key和value
(2)通过key获取值: hget/hmget
mapName key;
注:hmget
表示一次可以获取多个属性的值(key)
例:
hget myhash username //结果会输出:"zhengzaihong"
hmget myhash2 username age //结果会输出:
1)"liuqi"
2)"22"
(3)查看所有的key和value: hgetall
; 如:hgetall myhash2 将列出该Hash存储的全部的键和值
(4)删除一个或多个key和内容:hdel
mapname key key1 key2;删除整个字典 del
mapname,如:del myhash2
(5) hincrby
mapname num 5 (意思->取出mapname中key为num,然后运算 num=num+5)
(6) hdecrby
mapname num 5 (意思->取出mapname中key为num,然后运算 num = num-5)
(7)判断一个属性是否存在:hexists
mapname key,如:hexists myhash2 sex,如果存在则返回,(integer)1
否则:(integer)0
(8)获取hashMap的长度:hlen
mapname,如hlen myhash2
(9)获取hashMap所有的key:hkeys
mapname;
(10)获取hashMap所有的value:hvals
mapname;
存储list :
◆ Arraylistf使用数组方式
◆ Linkedlist使用双向链接方式
◆ 双向链表中增加数据
◆ 双向链表中删除数据
存储ist常用命:
头部添加:lpush
listname value,如:lpush mylist a b c 则c在头部
尾部添加:rpush
listname value,如:rpush mylist2 a b c 则c在最尾部
查看list集合: lrange
listname 下标起始位 下标结束位,如:lrange mylist 0 2
左边弹出:lpop
listname,如:lpop mylist 则将mylist最左边的c弹出,此时mylist也将不在有该值
右边弹出:rpop
listname,如:lpop mylist2 则将mylist2最右边的c弹出,此时mylist2也将不在有该值
获取list长度,llen
listname
扩展命令:
头部插入:lpushx
listname value,如果listname该集合存在则在该集合上插入value值,value值位于最顶端。
尾部插入:rpushx
listname value,如果listname该集合存在则在该集合上插入value值,value值位于最末端。
删除元素:
头部删除:lrem
listname "删除个数" "删除value",如:lrem mylist 1 c 指从头部开始删除一个值为c的元素。
尾部删除:lrem
listname "倒数第几位开始" "value" 如:lrem mylist -3 a 指从尾部开始删除一个值为a的元素。
插入元素:lset
listname "下标位置" "value"
之前/之后插入:linset
listname before/after "被插值" "插入值"
重一个集合的末端取出到存入一个集合顶端:rpoplpush
listname1 listname2 如图:
存储Set
◆和List类型不同的是,Set集合中不允许出现重复的元素
◆Set可包含的最大元素数量是4294967295
存储set常用命令:
sadd
myset a b c //向myset添加a,b,c元素
srem
myset 1 2 //删除myset中1,2元素
smembers
myset //查看set集合元素
sismember
myset a //判断 a 元素是否是集合 myset的成员
sdiff
mya1 myb1 //返回mya1和myb1集合的差集
sinter
mya2 myb2 //返回给定所有集合的交集
sunion
mya3 myb3//返回所有给定集合的并集
scard
myset //返回集合的size大小
srandmember
myset [count] //返回集合中一个或多个随机数
sdiffstore
my1 mya1 myb1 //返回给定mya1, myb1 集合的差集并存储在 my1 中
sinterstore
my2 mya2 myb2 //返回给定mya2和 myb2集合的交集并存储在 my2 中
sunionstore
my3 mya3 myb3 //所有给定mya3 和myb3集合的并集存储在 my3 集合中
存储 Sorted-Set
◆ Sorted-Set和Set的区别
◆ Sorted-Set中的成员在集合中的位置是有序的
zadd
mysort 70 zs 80 ls 90 ww //向有序集合添加一个或多个成员,或者更新已存在成员的分数( zadd key score1 member1 [score2 member2])
zscore
mysort zs //查看zs的分数
zcard
mysort //获取有序集合的成员数
zrem
mysort tom ww //删除tom 和ww信息
zrange
mysort 0 -1 //通过索引区间返回有序集合成指定区间内的成员,0到-1指从第一个元素到最后一个
zrevrange
mysort 0 -1 withscores //返回有序集中指定区间内的成员,通过索引,分数从高到底
zremrangebyrank
mysort 0 4 //移除有序集合中给定的排名区间的所有成员
zremrangebyscore
mysort 80 100 //移除有序集合中给定的分数区间的所有成员
zrangebyscore
mysort 0 100 //通过分数返回有序集合指定区间内的成员
Redis key通用命令
1、dump
key 序列化给定的key并返回序列化的值
2、exists
key 检查给定的key是否存在
3、expire
key seconds 为key设置过期时间
4、expire
key timestamp 用时间戳的方式给key设置过期时间
5、pexpire
key milliseconds 设置key的过期时间以毫秒计
6、keys
pattern 查找所有符合给定模式的key
7、move
key db 将当前数据库的key移动到数据库db当中
8、persists
key 移除key的过期时间,key将持久保存
9、pttl
key 以毫秒为单位返回key的剩余过期时间
10、ttl
key 以秒为单位,返回给定key的剩余生存时间
11、randomkey
从当前数据库中随机返回一个key
12、rename
key newkey 修改key的名称
13、renamenx
key newkey 仅当newkey不存在时,将key改名为newkey
14、type
key 返回key所存储的值的类型
15、del
key 删除key
16、setnx
key newvalue 仅当key 不存在时设置才会成功
17、strlen
返回字符的长度
Redis事务
1、discard
取消事务,放弃执行事务块内的所有命令。
2、exec
执行所有事务块内的命令。
3、multi
标记一个事务块的开始。
4、unwatch
取消 WATCH 命令对所有 key 的监视。
5、watch
key [key ...] 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
更多指令官方文档:https://redis.io/commands
看观们请注意本篇内容早在2017年所写,学习的小伙伴们请根据最新文档参照学习。