Redis 基本知识

Nosql

1、什么是nosql
为了解决高并发、高可用、高可扩展,大数据存储等一系列问题而产生的数据库解决方案,就是NoSql。
NoSql,叫非关系型数据库,它的全名Not only sql。它不能替代关系型数据库,只能作为关系型数据库的一个良好补充。

分类

1、键值(Key-Value)存储数据库 相关产品: Tokyo
Cabinet/Tyrant、Redis、Voldemort、Berkeley DB 典型应用:
内容缓存,主要用于处理大量数据的高访问负载。
数据模型: 一系列键值对 优势: 快速查询 劣势: 存储的数据缺少结构化。
2、列存储数据库 相关产品:Cassandra, HBase, Riak 典型应用:分布式的文件系统。
数据模型:以列簇式存储,将同一列数据存在一起 优势:查找速度快,可扩展性强,更容易进行分布式扩展 劣势:功能相对局限。

3、文档型数据库 相关产品:CouchDB、MongoDB
典型应用:Web应用(与Key-Value类似,Value是结构化的)
数据模型: 一系列键值对 优势:数据结构要求不严格 劣势:
查询性能不高,而且缺乏统一的查询语法

4、图形(Graph)数据库(图) 相关数据库:Neo4J、InfoGrid、Infinite Graph 典型应用:社交网络。
数据模型:图结构 优势:利用图结构相关算法。 劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。

Redis

什么是redis

c语言编写的键值非关系型数据库。主要用于高速访问的内容缓存,
redis也可以实现持久化,支持事务操作。
常用数据类型:
string(字符类型),
hash(散列类型),
list(列表类型),
set(集合类型),
sortedSet(有序集合)。

背景

2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG,然而没过多久该公司的创始人 Salvatore Sanfilippo便 对MySQL的性能感到失望,于是他决定亲自为LLOOGG量身定做一个数据库,并于2009年开发完成,这个数据库就是Redis。不过Salvatore Sanfilippo并不满足只将Redis用于LLOOGG这一款产品,而是希望更多的人使用它,于是在同一年Salvatore Sanfilippo将Redis(BSD)开源发布,并开始和Redis的另一名主要的代码贡献者Pieter Noordhuis一起继续着Redis的开发,直到今天。
Salvatore Sanfilippo自己也没有想到,短短的几年时间,Redis就拥有了庞大的用户群体。Hacker News在2012年发布了一份数据库的使用情况调查,结果显示有近12%的公司在使用Redis。国内如新浪微博、街旁网、知乎网,国外如GitHub、Stack Overflow、Flickr等都是Redis的用户。
VMware公司从2010年开始赞助Redis的开发, Salvatore Sanfilippo和Pieter Noordhuis也分别在3月和5月加入VMware,全职开发Redis。

Redis应用场景

缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用)
分布式集群架构中的session分离。
聊天室的在线好友列表。
任务队列。(秒杀、抢购、12306等等)
应用排行榜。
网站访问统计。
数据过期处理(可以精确到毫秒)

安装redis

  1. 下载

http://www.redis.io
http://www.redis.cn

  1. 安装

A. 准备: gcc环境
yum -y install gcc-c++
make命令:
yum -y install make
B. 下载解压
tar -zxvf redis-4.0.10.tar.gz -C /apps/
C. 切换到目录,编译
make:编译
清理: make distclean
D. 测试
make test(安装tcl)
E. 安装
make install(默认安装:/usr/local/bin)
make install PREFIX=apps/redis-5.0.5
F. 复制redis.conf到etc
cp redis.conf /etc/
G. 环境变量
export REDIS_HOME=apps/redis-5.0.5
export PATH= P A T H : PATH: PATH:JAVA_HOME/bin:$REDIS_HOME/bin
source /etc/profile

Redis启动(服务器端+客户端)

A. 前端启动(服务器前端运行)
服务器: ./redis-server
关闭:
强制关闭:ctrl+c
正常命令: ./redis-cli shutdown(推荐)
客户端:./redis-cli
B. 后端启动
修改配置文件:
bind 192.168.2.111(修改绑定ip)
daemonize yes(修改作为后台守护程序运行)
运行服务器端:
./redis-server /etc/redis.conf
关闭服务器端:
**kill -9 **
./redis-cli shutdown(推荐)
自带客户端连接:
./redis-cli -h ip地址 -p 端口
图形客户端:
需要关闭防火墙

设置密码及模式

修改 vi redis.conf 配置文件
找到 # requirepass foobared
requirepass 123 #指定密码123
将 bind 127.0.0.1 #注释
找到 protected-mode yes 修改为 no

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

  1. redis-cli
  2. 图形客户端RedisDesktopManager
  3. jedis

A. 单实例连接

package jedistest;
import org.junit.Test;
import redis.clients.jedis.Jedis;
public class JedisTest {
	  @Test
	  public void jedis() {
		  //1、创建对象 
		  Jedis jedis = new Jedis("192.168.2.111",6379);
		  //2、设置密码
		  jedis.auth("123");
		  //3、操作 
		  jedis.set("name","jasperlee");
		  System.out.println(jedis.get("name")); 
		  //4、关闭 
		  jedis.close(); 
	   }
}   

B. jedis连接池

package jedistest;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

public class jedistpool {
	@Test
	public void pool() {
		  //1、创建redis池
		  JedisPool pool= new JedisPool("192.168.2.111", 6379);
		  //2、从池中获取连接
		  Jedis jedis = pool.getResource();
		  //3、设置密码
		  jedis.auth("123");
		  //4、操作
		  jedis.set("age", "27");
		  System.out.println(jedis.get("age"));
		  //5、归还连接池
		  jedis.close();
		  //6、关闭池
		  pool.close();
	}
}

C. spring连接配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
		http://www.springframework.org/schema/mvc 
		http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context-3.2.xsd 
		http://www.springframework.org/schema/aop 
		http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
		http://www.springframework.org/schema/tx 
		http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">

	<!-- 连接池配置 -->
	<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
		<!-- 最大连接数 -->
		<property name="maxTotal" value="30" />
		<!-- 最大空闲连接数 -->
		<property name="maxIdle" value="10" />
		<!-- 每次释放连接的最大数目 -->
		<property name="numTestsPerEvictionRun" value="1024" />
		<!-- 释放连接的扫描间隔(毫秒) -->
		<property name="timeBetweenEvictionRunsMillis" value="30000" />
		<!-- 连接最小空闲时间 -->
		<property name="minEvictableIdleTimeMillis" value="1800000" />
		<!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->
		<property name="softMinEvictableIdleTimeMillis" value="10000" />
		<!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
		<property name="maxWaitMillis" value="1500" />
		<!-- 在获取连接的时候检查有效性, 默认false -->
		<property name="testOnBorrow" value="false" />
		<!-- 在空闲时检查有效性, 默认false -->
		<property name="testWhileIdle" value="true" />
		<!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
		<property name="blockWhenExhausted" value="false" />
	</bean>

	<!-- redis单机 通过连接池 -->
	<bean id="jedisPool" class="redis.clients.jedis.JedisPool"
		destroy-method="close">
		<constructor-arg name="poolConfig" ref="jedisPoolConfig" />
		<constructor-arg name="host" value="192.168.242.130" />
		<constructor-arg name="port" value="6379" />
	</bean>
</beans>

Redis数据类型

  1. String

1、 赋值: 语法:SET key value

127.0.0.1:6379> set name jasperlee
OK

2、 取值:语法:GET key

 127.0.0.1:6379> get name
"jasperlee“

3、取值并赋值:语法:GETSET key value

127.0.0.1:6379> getset age 27
"27"
127.0.0.1:6379> get age
"27"

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> mget k1 k2 
1) "v1" 
2) "v2"

5、删除:语法:DEL key

127.0.0.1:6379> del k3
(integer) 1

递增数字 :当存储的字符串是整数时,Redis提供了一个实用的命令INCR,其作用是让当前键值递增,并返回递增后的值。
1、数值增减:语法:INCR key

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

2、 增加指定的整数:语法:INCRBY key increment

127.0.0.1:6379> incrby num 2
(integer) 4
127.0.0.1:6379> get num
"4"
127.0.0.1:6379> incrby num 10
(integer) 14
127.0.0.1:6379> get num
"14"

3、递减数值:语法:DECR key

127.0.0.1:6379> decr num
(integer) 13
127.0.0.1:6379> decr num
(integer) 12

4、减少指定的整数:语法:DECRBY key decrement

127.0.0.1:6379> decrby num 3
(integer) 9
127.0.0.1:6379> decrby num 4
(integer) 5

APPEND的作用是向键值的末尾追加value。如果键不存在则将该键的值设置为value,即相当于 SET key value。返回值是追加后字符串的总长度。
5、 向尾部追加值: 语法:APPEND key value

127.0.0.1:6379> set str hello 
OK
127.0.0.1:6379> APPEND str world 
(integer) 10
127.0.0.1:6379> get str 
"helloworld"

STRLEN命令返回键值的长度,如果键不存在则返回0。
6、获取字符串长度:语法:STRLEN key

> 127.0.0.1:6379> strlen str
(integer) 10
127.0.0.1:6379> set str hello
OK
127.0.0.1:6379> get str
"hello"
127.0.0.1:6379> strlen str
(integer) 5

应用: 自增主键 ,商品编号、订单号采用string的递增数字特性生成。

127.0.0.1:6379> incr id
(integer) 1
127.0.0.1:6379> incr id
(integer) 2
127.0.0.1:6379> incr id
(integer) 3
127.0.0.1:6379> incr id
(integer) 4
127.0.0.1:6379> incr id
(integer) 5
  1. Hash(散列类型)

hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其它类型。如下:
在这里插入图片描述
HSET命令不区分插入和更新操作,当执行插入操作时HSET命令返回1,当执行更新操作时返回0。
一次只能设置一个字段值

1、赋值:语法:HSET key field value

127.0.0.1:6379> hset user username zhangsan
(integer) 1

2、 一次可以设置多个字段值
语法:HMSET key field value [field value …]

127.0.0.1:6379> hmset user  username zs age 20 
OK

当字段不存在时赋值,类似HSET,区别在于如果字段存在,该命令不执行任何操作 语法:HSETNX key field value
127.0.0.1:6379> hsetnx user age 30 如果user中没有age字段则设置age值为30,否则不做任何操作 (integer) 0

1、取值:一次只能获取一个字段值,语法:HGET key field

127.0.0.1:6379> hget user username
"zhangsan“

2、 一次可以获取多个字段值 语法:HMGET key field [field …]

127.0.0.1:6379> hmget user username age 
1) "zs" 
2) "20"

3、获取所有字段值:语法:HGETALL key

127.0.0.1:6379> hgetall user
1) "username" 
2) "zs" 
3) "age" 
4) "20"

4、删除字段:可以删除一个或多个字段,返回值是被删除的字段个数
语法:HDEL key field [field …]

127.0.0.1:6379> hdel user username
 (integer) 1
127.0.0.1:6379> hdel user age username
 (integer) 1 

5、增加数字:语法:HINCRBY key field increment

127.0.0.1:6379> hincrby user age 2	 将用户的年龄加2 (integer) 22
127.0.0.1:6379> hget user age		获取用户的年龄 "22“ 

6、判断字段是否存在:语法:HEXISTS key field

127.0.0.1:6379> hexists user age		查看user中是否有age字段
(integer) 1
127.0.0.1:6379> hexists user name	查看user中是否有name字段
(integer) 0

7、 只获取字段名或字段值:语法:HKEYS key,HVALS key

127.0.0.1:6379> hkeys user
1) "age"
2) "name"
127.0.0.1:6379> hvals user
1) "18" 
2) "zs"

8、获取字段数量:语法:HLEN key

127.0.0.1:6379> hlen user
(integer) 2

应用: 存储商品信息 商品字段 【商品id、商品名称、商品描述、商品库存、商品好评】 定义商品信息的key 商品1001的信息在
Redis中的key为:[items:1001]

127.0.0.1:6379> hmset items:1001 id 3 name apple price 999.9
OK
127.0.0.1:6379> hget items:1001 id
"3"
127.0.0.1:6379> hgetall items:1001
1) "id" 
2) "3"
3) "name" 
4) "apple" 
5) "price" 
6) "999.9"
  1. List

Arraylist是使用数组来存储数据,特点:查询快、增删慢
Linkedlist是使用双向链表存储数据,特点:增删快、查询慢,但是查询链表两端的数据也很快。
Redis的list是采用来链表来存储的,所以对于redis的list数据类型的操作,是操作list的两端数据来操作的。

向列表两端增加元素
1、向列表左边增加元素 :语法:LPUSH key value [value …]

127.0.0.1:6379> LPUSH  list1 1  2  3
(integer) 3

2、向列表右边增加元素 :语法:RPUSH key value [value …]

127.0.0.1:6379> RPUSH list1 a b c
(integer) 6

查看列表 LRANGE命令是列表类型最常用的命令之一,获取列表中的某一片段,将返回start、stop之间的所有元素(包含两端的元素),索引从0开始。索引可以是负数,如:“-1”代表最后边的一个元素。

查看列表:语法:LRANGE key start stop

127.0.0.1:6379> lrange list1 0 2
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> lrange list1 0 -1
1) "3"
2) "2"
3) "1"
4) "a"
5) "b"
6) "c"

从列表两端弹出元素
LPOP命令从列表左边弹出一个元素,会分两步完成:
第一步是将列表左边的元素从列表中移除
第二步是返回被移除的元素值。
语法:
LPOP key
RPOP key

127.0.0.1:6379> LPOP list1 
"3"
127.0.0.1:6379> RPOP list1
"c"

1、获取列表中元素的个数:语法:LLEN key

127.0.0.1:6379> LLEN list1
(integer) 5

2、 删除列表中指定的值:语法:LREM key count value

LREM命令会删除列表中前count个值为value的元素,返回实际删除的元素个数。根据count值的不同,该命令的执行方式会有所不同:

当count>0时, LREM会从列表左边开始删除。

127.0.0.1:6379> LREM list2 2 2
(integer) 2
127.0.0.1:6379> lrange list2 0 -1
 1) "b"
 2) "1"
 3) "a"
 4) "b"
 5) "c"
 6) "3"
 7) "2"
 8) "a"
 9) "c"
10) "3"
11) "b"
12) "a"
13) "2"
14) "1"

当count<0时, LREM会从列表后边开始删除。

127.0.0.1:6379> LREM list2 -2 a
(integer) 2
127.0.0.1:6379> lrange list2 0 -1
 1) "b"
 2) "1"
 3) "a"
 4) "b"
 5) "c"
 6) "3"
 7) "2"
 8) "c"
 9) "3"
10) "b"
11) "2"
12) "1"

当count=0时, LREM删除所有值为value的元素。

127.0.0.1:6379> LREM list2 0 b
(integer) 3
127.0.0.1:6379> lrange list2 0 -1
1) "1"
2) "a"
3) "c"
4) "3"
5) "2"
6) "c"
7) "3"
8) "2"
9) "1"

3、获得/设置指定索引的元素值:获得指定索引的元素值:语法:LINDEX key index

127.0.0.1:6379> LINDEX list2 2
"c"

4、设置指定索引的元素值 语法:LSET key index value

127.0.0.1:6379> LSET list2 2 3
OK
127.0.0.1:6379> lrange list2 0 -1
1) "1"
2) "a"
3) "3"
4) "3"
5) "2"
6) "c"
7) "3"
8) "2"
9) "1"

5、只保留列表指定片段
指定范围和LRANGE一致 :语法:LTRIM key start stop

127.0.0.1:6379> lrange list2 0 -1
1) "1"
2) "a"
3) "3"
4) "3"
5) "2"
6) "c"
7) "3"
8) "2"
9) "1"
127.0.0.1:6379> LTRIM list2 0 3
OK
127.0.0.1:6379> lrange list2 0 -1
1) "1"
2) "a"
3) "3"
4) "3"

6、向列表中插入元素
该命令首先会在列表中从左到右查找值为pivot的元素,然后根据第二个参数是BEFORE还是AFTER来决定将value插入到该元素的前面还是后面。
语法:LINSERT key BEFORE|AFTER pivot value

127.0.0.1:6379> LINSERT list2 before 3 5
(integer) 5
127.0.0.1:6379> lrange list2 0 -1
1) "1"
2) "a"
3) "5"
4) "3"
5) "3"
127.0.0.1:6379> LINSERT list2 after 3 4
(integer) 6
127.0.0.1:6379> lrange list2 0 -1
1) "1"
2) "a"
3) "5"
4) "3"
5) "4"
6) "3"

7、将元素从一个列表转移到另一个列表中
语法:RPOPLPUSH source destination

127.0.0.1:6379> RPOPLPUSH list2 list1
"3"
127.0.0.1:6379> lrange list1 0 -1
1) "3"
2) "3"
3) "2"
4) "1"
5) "a"

应用
商品评论列表,在Redis中创建商品评论列表,用户发布商品评论,将评论信息转成json存储到list中。
用户在页面查询评论列表,从redis中取出json数据展示到页面。
定义商品评论列表key: 商品编号为1001的商品评论key【items: comment:1001】

127.0.0.1:6379> LPUSH items:comment:1001 '{"id":1,"name":"商品不错,很好!!","date":1430295077289}'
(integer) 1
  1. Set(集合类型)

集合类型:无序、不可重复。
列表类型:有序、可重复。

1、增加元素:语法:SADD key member [member …]

127.0.0.1:6379> sadd set a b c
(integer) 3
127.0.0.1:6379> sadd set a
(integer) 0

2、 删除元素:语法:SREM key member [member …]

127.0.0.1:6379> srem set c d
(integer) 1

3、获得集合中的所有元素:语法:SMEMBERS key

127.0.0.1:6379> smembers set
1) "a" 
2) "b"

4、判断元素是否在集合中:语法:SISMEMBER key member

127.0.0.1:6379> sismember set a  
(integer) 1      # 返回1表示存在
127.0.0.1:6379> sismember set e
(integer) 0      # 返回0表示不存在

运算命令
1、集合的差集运算:属于A并且不属于B的元素构成的集合
语法:SDIFF key [key …]

127.0.0.1:6379> sadd setA 1 2 3
(integer) 3
127.0.0.1:6379> sadd setB 2 3 4
(integer) 3
127.0.0.1:6379> sdiff setA setB 
1) "1"
127.0.0.1:6379> sdiff setB setA 
1) "4"

2、集合的交集运算:属于A且属于B的元素构成的集合。
语法:SINTER key [key …]

127.0.0.1:6379> sinter setA setB
1) "2" 
2) "3"

3、集合的并集运算:属于A或者属于B的元素构成的集合 语法:SUNION key [key …]

127.0.0.1:6379> sunion setA setB
1) "1" 
2) "2" 
3) "3" 
4) "4"

4、获得集合中元素的个数:语法:SCARD key

127.0.0.1:6379> scard setA
(integer) 3

从集合中弹出一个元素:语法:SPOP key 注意:由于集合是无序的,所有SPOP命令会从集合中随机选择一个元素弹出

127.0.0.1:6379> SPOP setA
"3"
  1. Sortedset

Sortedset又叫zset
Sortedset是有序集合,可排序的,但是唯一。
Sortedset和set的不同之处,是会给set中的元素添加一个分数,然后通过这个分数进行排序。

1、 增加元素:向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数。返回值是新加入到集合中的元素个数,不包含之前已经存在的元素。
语法:ZADD key score member [score member …]

127.0.0.1:6379> zadd score 80 zhangsan 89 lisi 94 wangwu 
(integer) 3
127.0.0.1:6379> zadd score 97 lisi
(integer) 0

2、获取元素的分数:语法:ZSCORE key member

127.0.0.1:6379> zscore score lisi
"97"

3、删除元素:移除有序集key中的一个或多个成员,不存在的成员将被忽略。 当key存在但不是有序集类型时,返回一个错误。 语法:ZREM key
member [member …]

127.0.0.1:6379> zrem score lisi
(integer) 1

4、 获得排名在某个范围的元素列表:获得排名在某个范围的元素列表,按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素(包含两端的元素)。 语法:ZRANGE key start stop [WITHSCORES]

127.0.0.1:6379> zrange score 0 2
1) "zhangsan" 
2) "wangwu"

5、按照元素分数从大到小的顺序返回索引从start到stop之间的所有元素(包含两端的元素)
语法:ZREVRANGE key start stop [WITHSCORES]

127.0.0.1:6379> ZREVRANGE score 0 2
1) "wangwu" 
2) "zhangsan"

6、如果需要获得元素的分数的可以在命令尾部加上WITHSCORES参数

127.0.0.1:6379> ZRANGE score 0 1 withscores
1) "zhangsan"
2) "80"
3) "wangwu"
4) "94"

7、 获取元素的排名, 从小到大语法:ZRANK key member

127.0.0.1:6379> ZRANk score zhangsan
(integer) 0

8、从大到小,语法:ZREVRANK key member

127.0.0.1:6379> ZREVRANK score zhangsan
(integer) 1

9、获得指定分数范围的元素
语法:ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

127.0.0.1:6379> ZRANGEBYSCORE score 90 100 WITHSCORES
1) "wangwu"
2) "94"
127.0.0.1:6379> ZRANGEBYSCORE score 70 100 limit 1 2
1) "wangwu"``

10、增加某个元素的分数:返回值是更改后的分数
语法:ZINCRBY key increment member

127.0.0.1:6379> ZINCRBY score 100 lisi
"104"

11、获得集合中元素的数量:语法:ZCARD key

127.0.0.1:6379> ZCARD score
(integer) 3

12、获得指定分数范围内的元素个数

127.0.0.1:6379> ZCOUNT score 80 100
(integer) 2

13、按照排名范围删除元素:语法:ZREMRANGEBYRANK key start stop

127.0.0.1:6379> ZREMRANGEBYRANK score 0 1
(integer) 2
127.0.0.1:6379> ZRANGE score  0 -1
1) "lisi"

14、按照分数范围删除元素:语法:ZREMRANGEBYSCORE key min max

127.0.0.1:6379> ZADD score 111 zhaoliu
(integer) 1
127.0.0.1:6379> ZREMRANGEBYSCORE score 80 120
(integer) 1

应用:商品销售排行榜
需求:根据商品销售量对商品进行排行显示
思路:定义商品销售排行榜(sorted set集合),Key为items:sellsort,分数为商品销售量。
1、写入商品销售量:商品编号1001的销量是9,商品编号1002的销量是10

127.0.0.1:6379> ZADD items:sellsort 9 1001 10 1002
(integer) 2

2、商品编号1001的销量加1:

127.0.0.1:6379> ZINCRBY items:sellsort 1 1001
"10"

3、商品销量前10名:

127.0.0.1:6379> ZRANGE items:sellsort 0 9 withscores
1) "1001"
2) "10"
3) "1002"
4) "10"

keys命令

1、返回满足给定pattern 的所有key

127.0.0.1:6379> keys list
1) "list"

2、exists:确认一个key 是否存在, 示例:从结果来看,数据库中不存在jasperlee 这个key,但是age 这个key是存在的

127.0.0.1:6379> exists jasperlee
(integer) 0
127.0.0.1:6379> exists age
(integer) 1

3、del:删除一个key

127.0.0.1:6379> del age
(integer) 1
127.0.0.1:6379> exists age
(integer) 0

4、rename:重命名key
示例:age 成功的被我们改名为age_new 了

127.0.0.1:6379> keys *
 1) "setB"
 2) "id"
 3) "list1"
 4) "num"
 5) "score"
 6) "country"
 7) "items:sellsort"
 8) "k2"
 9) "list"
10) "items:comment:1001"
11) "k1"
12) "str"
13) "address"
14) "setA"
15) "name"
16) "adress"
17) "user"
18) "items:1001"
19) "set"
20) "county"
21) "item:id"
127.0.0.1:6379> rename user users
OK
1) "setB"
 2) "id"
 3) "list1"
 4) "num"
 5) "score"
 6) "country"
 7) "items:sellsort"
 8) "k2"
 9) "list"
10) "items:comment:1001"
11) "k1"
12) "str"
13) "address"
14) "setA"
15) "name"
16) "adress"
17) "users"
18) "items:1001"
19) "set"
20) "county"
21) "item:id"

5、type:返回值的类型
示例:这个方法可以非常简单的判断出值的类型

127.0.0.1:6379> type list1
list
127.0.0.1:6379> type name
string
127.0.0.1:6379> type set
set

6、设置key的生存时间
Redis在实际使用过程中更多的用作缓存,然而缓存的数据一般都是需要设置生存时间的,即:到期后数据销毁。
EXPIRE key seconds 设置key的生存时间(单位:秒)key在多少秒后会自动删除
TTL key 查看key生于的生存时间
PERSIST key 清除生存时间
PEXPIRE key milliseconds 生存时间设置单位为:毫秒

127.0.0.1:6379> set firstname jasper         设置firstname 的值为jasper 
OK
127.0.0.1:6379> get firstname                   获取firstname 的值
"jasper"
127.0.0.1:6379> EXPIRE firstname 20     设置firstname的生存时间为20秒
(integer) 1
127.0.0.1:6379> TTL firstname      查看firstname的生于生成时间还有14秒删除
(integer) 14
127.0.0.1:6379> TTL firstname
(integer) -2
127.0.0.1:6379> get firstname         获取firstname 的值,已经删除
(nil)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园建设方案旨在通过融合先进技术,如物联网、大数据、人工智能等,实现校园的智能化管理与服务。政策的推动和技术的成熟为智慧校园的发展提供了基础。该方案强调了数据的重要性,提出通过数据的整合、开放和共享,构建产学研资用联动的服务体系,以促进校园的精细化治理。 智慧校园的核心建设任务包括数据标准体系和应用标准体系的建设,以及信息化安全与等级保护的实施。方案提出了一站式服务大厅和移动校园的概念,通过整合校内外资源,实现资源共享平台和产教融合就业平台的建设。此外,校园大脑的构建是实现智慧校园的关键,它涉及到数据中心化、数据资产化和数据业务化,以数据驱动业务自动化和智能化。 技术应用方面,方案提出了物联网平台、5G网络、人工智能平台等新技术的融合应用,以打造多场景融合的智慧校园大脑。这包括智慧教室、智慧实验室、智慧图书馆、智慧党建等多领域的智能化应用,旨在提升教学、科研、管理和服务的效率和质量。 在实施层面,智慧校园建设需要统筹规划和分步实施,确保项目的可行性和有效性。方案提出了主题梳理、场景梳理和数据梳理的方法,以及现有技术支持和项目分级的考虑,以指导智慧校园的建设。 最后,智慧校园建设的成功依赖于开放、协同和融合的组织建设。通过战略咨询、分步实施、生态建设和短板补充,可以构建符合学校特色的生态链,实现智慧校园的长远发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值