Redis(1)
1.目录
1、 redis介绍
a) 什么是NoSql
b) NoSql的分类
c) 什么是redis
d) Redis干啥用
2、 redis安装(重点)
3、 redis客户端
a) redis自带客户端
b) 图形界面的客户端(了解)
c) Java客户端jedis(重点)
4、 Redis数据类型(重点)
a) String类型
b) Map类型
c) List类型
d) Set类型
e) SortedSet
2 Redis介绍
2.1 什么是NoSql
为了解决高并发,高可用,高可扩展,大数据存储等一系列的问题而产生的数据库解决方案就是Nosql。
Nosql,也叫做非关系行数据库,它的全名叫Not only sql。它不能代替关系型数据库,只能作为关系型数据
库的一个良好补充。
关系型数据库是指:Mysql, oracle,sqlserver
2.2NoSql的分类
a.键值存储数据库
相关产品:Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
典型应用: 内容缓存,主要用于处理大量数据的高访问负载。
数据模型: 一系列键值对(key-value)
优势: 快速查询
劣势: 存储的数据缺少结构化
b.列表存储数据库
相关产品:Cassandra, HBase, Riak
典型应用:分布式的文件系统
数据模型:以列簇式存储,将同一列数据存在一起
优势:查找速度快,可扩展性强,更容易进行分布式扩展
劣势:功能相对局限
c.文档性数据库
相关产品:CouchDB,MongoDB
典型应用:web应用(与key-Value类似,Value是结构化的)
数据模型:一系类键值对
优势:数据结构要求不严格
劣势:查询性能不高缺乏统一的查询语法
d. 图形(Graph)数据库
相关数据库:Neo4J、InfoGrid、Infinite Graph
典型应用:社交网络
数据模型:图结构
优势:利用图结构相关算法。
劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。
2.3 什么是Redis
Redis是使用c语言开发的一个高性能键值数据库。Redis可以通过一些键值
类型来存储数据。
键值类型:
String 字符类型
map散列类型
list列表类型
set集合类型
sortedset有序集合类型
2.4redis历史发展
开始于08年意大利一个叫 Salvatore Sanfilippo牛逼的人。
2.5 redis应用场景
缓存(数据查询,短链接,新闻内容,商品内容)
分布式集群框架中的session分离
任务队列。(秒杀,抢购,12306等等)
应用场景排行榜。
(Sortest)
网站访问统计
数据过期处理
3 redis安装
3.1 redis下载
官网地址:http://redis.io/
3.2 redis安装
redis安装环境会安装到Linux系统中。
安装一个远程插件叫filezillaclient_406,然后把Redis拉到它的目录下
(注意头部的主机,用户名不要忘记填)
进行安装的时候一定要保证你的虚拟机能够联网
# cd/
#ls
# cd opt
对redis的压缩包进行解压缩
a. Redis解压缩之后的文件是用c语言写的源码文件
[root@localhost ~]# tar -xvf redis-4.0.11.tar.gz
安装c语言环境(安装centos之后,自带c语言环境)
b. [root@localhost ~]# yum install gcc-c++
编译redis源码
[root@localhost ~]# cd redis-4.0.11
[root@localhost redis-3.0.0]# make
安装redis
[root@localhost redis-3.0.0]# make install PREFIX=/usr/local/redis
注意:
这一步如果报这个错误You need tcl 8.5 or newer in order to run the Redis test
则安装tcl
wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz
tar -zxvf tcl8.6.1-src.tar.gz
cd /tcl8.6.1/unix/
sudo ./configure
sudo make
sudo make install
3.3.1前段启动
前端启动的命令:
[root@localhost bin]# ./redis-server
前端启动的关闭:
强制关闭:Ctrl+c
正常关闭:[root@localhost bin]# ./redis-cli shutdown
杀掉进程:ps –aux|grep redis 查redis服务的进程编号
然后使用kill -9 进程编码
启动界面:
前端启动的问题:
一旦客户端关闭,则redis服务也停掉。
3.3.2后端启动
第一步:需要将redis解压之后的源码包中的redis.conf文件拷贝到bin目录下
[root@localhost bin]# cp /redis的解压目录下/redis.conf ./
第二步:修改redis.conf文件,将daemonize改为yes
先要使用vim redis.conf
第三步:使用命令后端启动redis
[root@localhost bin]# ./redis-server redis.conf
第四步:查看是否启动成功
ps -aux|grep redis
看是否有redis进程
root 20157 0:00 ./redis-server 127.0.0.1:6379
关闭后端启动的方式:
强制关闭:[root@localhost bin]# kill -9 20157
正常关闭:[root@localhost bin]# ./redis-cli shutdown
在项目中,建议使用正常关闭。
因为redis作为缓存来使用的话,将数据存储到内存中,如果使用正常关闭,则会将内存数据持久化到本地之后,再关闭。
如果是强制关闭,则不会进行持久化操作,可能会造成部分数据的丢失。
4 Redis客户端
4.1redis自带的客户端
启动
启动客户端命令:
[root@localhost bin]# ./redis-cli -h 127.0.0.1 -p 6379
-h:指定访问的redis服务器的IP地址
-p:指定访问的redis服务器的port端口
./redis-cli -h 127.0.0.1 -p 6379 --raw //可让中文显示
还可以写成:[root@localhost bin]# ./redis-cli
使用默认配置:默认的IP[127.0.0.1],默认的port [6379]
关闭
Ctrl+c
127.0.0.1:6379>quit
测试
[root@localhost bin]# ./redis-cli -h 127.0.0.1 -p 6379 --raw 127.0.0.1:6379>set name 张三 ok 127.0.0.1:6379> get name 张三
4.2图形界面客户端
安装:
redis-desktop-manager-0.7.9.809.exe
16 的db
默认存储的第一个db
使用命令开放6379端口
firewall-cmd --permanent --add-port=6379/tcp
4.3 jedis客户端
4.3.1 jedis介绍
Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java、C、C#、C++、php、Node.js (火)、Go等。
在官方网站里列一些Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。 在企业中用的最多的就是Jedis,下面我们就重点学习下Jedis。
Jedis同样也是托管在github上,地址:https://github.com/xetorthio/jedis
Redis:nosql数据库
Jedis:java客户端工具(通过代码操作redis)
4.3.2 工程搭建
添加jar包
Jedis-2.7.0.jar
Commons-pool2-2.3.jar
依赖
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.7.3</version> </dependency>
4.3.3单实例连接 redis
public class JedisDemo01 { public static void main(String[] args) { //创建jedis对象 参数一:主机的ip 参数二:redis的端口 Jedis jedis = new Jedis("192.168.82.188",6379) //通过redis赋值 jedis.set("a","张三"); //通过redis取值 System.out.println(jedis.get("a")); jedis.mset("name","张三","password","admin"); List<String> list = jedis.mget("name","password"); System.out.println(list.toString()); jedis.append("name","丰"); System.out.println(jedis.get("name")); jedis.close(); } }
4.3.4使用jedis连接池连接redis服务器
public class JedisDemo02 { public static void main(String[] args) { //JedisPool JedisPool jedisPool = new JedisPool("192.168.82.188",6379); //通过连接池获取jedis对象 Jedis jedis = jedisPool.getResource(); //hash结构 jedis.hset("user","username","张三"); Map<String,String> map = new HashMap<String, String>(); map.put("password","jbgsn"); map.put("age","19"); jedis.hmset("user",map); Map<String,String> map1 = jedis.hgetAll("user"); System.out.println(map1.keySet()+"---"+map1.values()); jedis.close(); } }
5 Redis数据类型
5.1String
5.1.1 命令
5.1.1.1赋值
语法: set key value
127.0.0.1:6379>set name zhangsan
ok
5.1.1.2取值
语法: get key
127.0.0.1:6379> get name
"zhangsan"
5.1.1.3取值并赋值
语法: Getset key value
127.0.0.1:6379>getset s2 22
"zhangsan"
127.0.0.1:6379>get s2
"22"
5.1.1.4设置/获取多个键值
语法:
mset key value [ key value……]
mget key[ key……]
127.0.0.1:6379>mset k1 v1 k2 v2 k3 v3
ok
127.0.0.1:6379>get k1
"v1"
127.0.0.1:6379>mget k1 k3
1)"v1"
2)"v3
5.1.1.5删除
语法:del key
127.0.0.1:6379>del name
(integer) 1
5.1.1.6 数值增减
incr 增加一
incrby
decr 减一
decrby
递增数字
当存储的字符串是整数时,redis提供一个实用的命令incr,其作用是让当前键值递增
并返回递增后的值。
语法:incr key(increment)
127.0.0.1:6379>incr num (integer) 1 127.0.0.1:6379>incr num (integer) 2 127.0.0.1:6379> incr num (integer)3
增加指定的整数
语法:Incrby key increment
127.0.0.1:6379>incrby num2 (integer) 5 127.0.0.1:6379>incrby num2 (integer) 7 127.0.0.1:6379>incrby num2 (integer) 9
递减数值
语法:decr key
127.0.0.1:6379>decr num (integer)9 127.0.0.1:6379>decr num (integer)8
减少指定的整数
语法:decrby key decrement
127.0.0.1:6379>decr num (integer)6 127.0.0.1:6379>decr num (integer)5 127.0.0.1:6379>decrby num3 (integer)2 127.0.0.1:6379>decrby num3 (integer)-1
5.1.1.7 其它命令
5.1.1.7.1向尾部追加值
append的作用是向键值的末尾追加value。如果键不存在则将改键的值设置为value,
相当于set key value。返回值是追加后字符串的总长度。
语法:append key value
127.0.0.1:6379>set str hello ok 127.0.0.1:6379> append str "world!" (integer) 12 127.0.0.1:6379>get str "hello world!"
5.1.1.7.2 获取字符串的长度
strlen命令返回键值的长度,如果键不存在则返回0
语法:strlen key
127.0.0.1:6379>strlen str (integer) 0 127.0.0.1:6379> set str hello ok 127.0.0.1:6379> strlen str (integer)5
5.1.2应用
5.1.2.1自增主键
语法:incr 主键名
5.2 Hash
散列类型
5.2.1 使用string的问题
假设有User对象以JSON序列化的形式存储到Redis中,User对象有id,username、password、age、name等属性,存储的过程如下:
保存、更新:User对象----json(String)----redis
如果在业务上只是更新age属性,其他的属性并不做更新我应该怎样做呢?
如果任然采用上边的方法在传输,处理时会造成资源浪费,hash可以很好的解决这个问题
如:user:username=“admin” ,password=“123456” ,age=18 使用string存储: set user{username=“admin”,password=“123456”,age=18} set user1{username="admin",password="123456",age="17"} 以上是浪费资源的方法
5.2.2redis hash 介绍
hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型,
集合集合类型等其它类型。如下:
5.2.3 命令
5.2.3.1 赋值
Hset命令不区分插入和更新操作,当执行插入操作时hset命令返回1,
当执行更新操作时返回0.
语法:Hset key field value
127.0.0.1:6379>hset user username zhangsan
(integer) 1
一次可以设置多个字段值
语法:hmset key field value[field value……]
127.0.0.1:6379>hmset user age 20 username lisi
ok
当字段不存在赋值,类似hset,区别在于如果字段存在,该命令不执行任何命令
语法:hsetnx key filed value
127.0.0.1:6379>hsetnx user age 30 如果user中没有age字段则设置age为30,
否则不做任何操作
(integer)0