精华内容
下载资源
问答
  • redis list类型实现最简单的队列

    千次阅读 2018-09-25 16:30:43
    redis有个list类型,可以用来实现一定程度上的消息队列。 如果我们要开发一个电商网站,其中一个很重要的模块就是订单模块(包括订单数据入库、商品库存减少 等)。 系统大一点儿(有逼格点儿),就会考虑把订单数据入库...

    消息队列的好处

    提高响应速度、解耦、稳定性(故障处理)、可扩展性、有序性、异步性。

    redis实现消息队列方法1

    redis有个list类型,可以用来实现一定程度上的消息队列。

    如果我们要开发一个电商网站,其中一个很重要的模块就是订单模块(包括订单数据入库、商品库存减少 等)。

    系统大一点儿(有逼格点儿),就会考虑把订单数据入库库存操作分开为单独的服务,比如订单服务里完成订单数据入口,然后调用商品服务来完成库存操作。

    如果如果订单服务在调用商品服务的过程中发生了意外,是否需要告诉用户下单失败?
    其实库存操作和用户没有什么关系了,我们只需要在订单入口之后就通知用户下单成功。库存操作,完成可以延后执行。

    这个时候,我们需要一个队列,来保存哪些订单需要执行库存操作。

    #比如这样一个队列
    订单5,订单4,订单3,订单2,订单1
    

    我们的商品服务端(可以有多个商品服务端) 来循环从这个队列中取出数据,去完成库存操作。

    基本命令

    lpush orders id001
    lpush orders id002
    

    从队列左边插入。

    # 查看orders列表中所有数据
    lrange orders 0 -1
    
    # 弹出
    127.0.0.1:6379> brpop orders 10
    1) "orders"
    2) "id001"
    

    我们加入队列是从左边加的,为了保证有序性使用brpop从右边弹出(移除)。

    brpop key timeout
    如果列表中没有数据,会阻塞,直到timeout
    

    死循环从队列中取数据

    上面说到我们的商品服务端可以死循环地从队列中取出订单数据,示例代码如下:

    while(true){
        $res = $redis->brpop(["orders"],10);
        if($res && $res[0]){
            // 然后做 库存操作
            echo '订单号:'.$res[1];
            
            usleep(500*1000); // 休眠500毫秒
        }else{
            continue;
        }
    }
    
    展开全文
  • ; charset=UTF-8" pageEncoding="UTF-8"%> <!... ... ; charset=UTF-8"> ...我想做一个查询,但是前台是显示文字:正常,异常,,,数据库存的是0,1代号, 问题是我现在提交的文字后台数据库也提取不了啊,如何做转换
  • 问题:数据库存一个字段存储List形式的数据,在前端for循环遍历取list里面的对象时出现arr[0]为"[" 原因:把该字段当做字符串处理了 解决方案:如下 var str="[{x:121.4059,y:31.026147},{x:121.407131,y:31....

    问题:数据库存一个字段存储List形式的数据,在前端for循环遍历取list里面的对象时出现arr[0]为"["

    原因:把该字段当做字符串处理了

    解决方案:如下

    var str="[{x:121.4059,y:31.026147},{x:121.407131,y:31.022982},{x:121.40877,y:31.023493},{x:121.407566,y:31.026646}]";
    var arr=eval(str);
    for(var i=0;i<arr.length;i++){
       alert(arr[i].x);
       alert(arr[i].y);
    }
    

     

    利用 eval(str)去转化

    展开全文
  • 我面试被问到的时候有点懵,因为之前的业务都没有涉及到这个,我回答的是加锁,后面我看过其他人的回答后,总结了几种方法 1.数据库乐观锁 加一个字段版本号 ...3.用redis的List数据类型 把所有秒杀请求插入...

    我面试被问到的时候有点懵,因为之前的业务都没有涉及到这个,我回答的是加锁,后面我看过其他人的回答后,总结了几种方法

    1.数据库乐观锁

    加一个字段版本号

    扣库存的时候判断一下版本号

    2.把库存字段改为unsigned

    这样可以保证库存不为负数,如果并发情况下被扣为负数的时候会报错,这个时候try catch然后返回库存不足就可以了

    3.用redis的List数据类型

    把所有秒杀请求插入到redis的队列了,当库存达到阈值后停止插入,然后消费redis里的数据

     

     

     

     

    展开全文
  • System.out.println(list.get(0).get("sum(c.couponfee/100)")); BigDecimal sum = new BigDecimal((Double)(list.get(0).get("sum(c.couponfee/...max和min数据库存的decima类型,怎么转换和sum比大小啊?? 更多 0
  • 数据库存的数据是这样的:["192.168.1.1", "192.168.1.2-192.168.1.255", "192.168.1.0/24"] 这是什么数据类型,不是json吧,想要转换成list,或者string[] ,怎么做
  • 其中com.hyg.view是用户层,com.hyg.service是业务层,com.hyg.dao是和数据库的链接层,com.hyg.model用于建立数据类型。 Menu.java的代码为 package com.hyg.view; import java.util.List; import java.util....

    用Java和mysql实现一个库存管理系统

    包和类的关系图

    建立的包和类的关系如上。其中com.hyg.view是用户层,com.hyg.service是业务层,com.hyg.dao是和数据库的链接层,com.hyg.model用于建立数据类型。
    Menu.java的代码为

    package com.hyg.view;
    
    import java.util.List;
    import java.util.Scanner;
    
    import com.hyg.model.User;
    import com.hyg.service.UserService;
    
    public class Menu {
    	UserService userService=new UserService();
    	Scanner sc=new Scanner(System.in);
    	int result=sc.nextInt();
    	public void loginView(){
    			System.out.println("-----------");
    			System.out.println("--1.登录---");
    			System.out.println("--2.退出---");
    			System.out.println("请输入要进行的操作:");
    			
    			if(result==1){
    				//登录
    				System.out.println("请输入账号");
    				String userno=sc.next();
    				System.out.println("请输入密码");
    				String pwd=sc.next();
    				//调用业务层的方法
    				
    				User user = userService.login(userno,pwd);
    				if(user!=null){
    					//登录
    					System.out.println("登录成功");
    					indexView(user);
    				}else{
    					//登录失败
    					System.out.println("登录失败");
    					loginView();
    				}
    				
    				
    				
    			}else{
    				//退出
    				System.out.println("您已退出程序");
    			}
    					
    	}
    	private void indexView(User user) {
    		System.out.println("\t\t\t欢迎 [" + user.getUsername() + "]登录本系统!");
    	    System.out.println("\t\t\t--------1、基库存管理----------");
    	    System.out.println("\t\t\t-----------1.1 库存查询----------");
    	    System.out.println("\t\t\t-----------1.2 入库管理----------");
    	    System.out.println("\t\t\t-----------1.3 出库管理----------");
    	    System.out.println("\t\t\t--------2、报表管理----------");
    	    System.out.println("\t\t\t-----------2.1 库存月报----------");
    	    System.out.println("\t\t\t-----------2.2 物资台账----------");
    	    System.out.println("\t\t\t--------3、基础信息管理----------");
    	    System.out.println("\t\t\t-----------3.1 用户管理----------");
    	    System.out.println("\t\t\t-----------3.2 部门管理----------");
    	    System.out.println("\t\t\t-----------3.3 仓库管理----------");
    	    System.out.println("\t\t\t-----------3.4 供应商管理----------");
    	    System.out.println("\t\t\t-----------3.5 产品管理----------");
    	    System.out.println("\t\t\t--------4、退出系统----------");
    	    System.out.print("请输入要进行的操作:");
    		String rescult=sc.next();
    	    if(rescult.equals("3.1")){
    	    	//进入用户管理
    	    	userView(user);
    	    }else if(rescult.equals("3.2")){
    	    	//进入部门管理
    	    	
    	    }
    	}
    	/**
    	 * 用户管理
    	 * @param user 当前登录的用户对象
    	 */
    	private void userView(User user){
    		System.out.println("\t\t\t------------------欢迎到用户管理界面------------------");
    	    System.out.println("\t\t\t------------------1、查看用户信息------------------");
    	    System.out.println("\t\t\t------------------2、添加用户信息------------------");
    	    System.out.println("\t\t\t------------------3、修改用户信息------------------");
    	    System.out.println("\t\t\t------------------4、删除用户信息------------------");
    	    System.out.println("\t\t\t------------------5、返回上一级------------------");
    	    System.out.print("请输入要进行的操作:");
    	    int result=sc.nextInt();
    	    if(result==1){
    	    	//查询用户
    	    	List<User> list=userService.findUserList();
    	    	System.out.println("ID"+"\t姓名"+"\t\t账号"+"\t密码"+"\t职位"+"\t年龄");
    	    	for(int i=0;i<list.size();i++){
    	    		User u=list.get(i);
    	    		System.out.println(u.getId()+"\t"+u.getUsername()+"\t"+u.getUserno()+"\t"+u.getPwd()+"\t"+u.getPosition()+"\t"+u.getAge());
    	    	}
    	    	userView(user);//继续执行
    	    }else if(result==2){
    	    	//添加用户
    	    	System.out.println("请输入账号:");
    	    	String userno=sc.next();
    	    	System.out.println("请输入密码:");
    	    	String pwd=sc.next();
    	    	
    	    	User u=new User();
    	    	u.setUserno(userno);
    	    	u.setPwd(pwd);
    	    	
    	    	Boolean flag=userService.addUser(u);
    	    	if(flag){
    	    		//添加成功
    	    		System.out.println("添加成功");
    	    	}else{
    	    		//添加失败
    	    		System.out.println("添加失败");
    	    	}
    	    	userView(user);//调用当前方法继续进行
    		
    	       }else if(result==3){
    	    	//修改用户信息
    		   System.out.println("请输入要修改用户的id:");
    	       int id=sc.nextInt();
    	       System.out.println("请输入密码:");
    	       String pwd=sc.next();
    	       System.out.println("请输入职位:");
    	       String position=sc.next();
    	       
    	       User u=new User();
    	       u.setId(id);
    	       u.setPwd(pwd);
    	       u.setPosition(position);
    	       Boolean flag=userService.updateUser(u);
    	       if(flag){
    	    	   //修改成功
    	    	   System.out.println("修改成功");
    	       }else{
    	    	   //修改失败
    	    	   System.out.println("修改失败,可能是密码错误");
    	       }
    	       userView(user);
    	       
    	       }else if(result == 4){
    		    //删除用户信息
    	    	System.out.println("请输入要删除用户的id");
    	    	int id=sc.nextInt();  
    	    	User u=new User();
    	    	u.setId(id);
    	    	
    	    	Boolean flag=userService.delUser(u);
    	    	if(flag){
    		    	   //删除成功
    		    	   System.out.println("删除成功");
    		       }else{
    		    	   //删除失败
    		    	   System.out.println("删除失败");
    		       }
    		       userView(user);
    	    }else{
    		//返回上一级
    		}
    	}
    	public static void main(String[] args) {
    		Menu m=new Menu();
    		m.loginView();
    	}
    
    }
    
    

    UserService.java的代码为

    package com.hyg.service;
    
    import java.util.List;
    
    import com.hyg.dao.UserDao;
    import com.hyg.model.User;
    
    public class UserService {
    
    	UserDao userDao=new UserDao();
    	/**
    	 * 
    	 * @param userno 账号
    	 * @param pwd 密码
    	 * @return true 登录成功 false 登录失败
    	 * user用户对象 存储用户数据
    	 */
    	public User login(String userno, String pwd) {
    		
    		return userDao.login(userno,pwd);
    	}
    	public List<User> findUserList() {
    		// 查询用户列表,返回用户集合
    		return userDao.findUserList();
    	}
    	/**
    	 * 添加用户
    	 * @param u 用户对象
    	 * @return true添加成功 false 添加失败
    	 */
    	public Boolean addUser(User u){
    		return userDao.addUser(u);
    		
    	}
    	/**
    	 * 修改用户职位
    	 * @param 
    	 * @return
    	 */
    	public Boolean updateUser(User u){
    		return userDao.updateUser(u);
    	}
    	/**
    	 * 删除用户信息
    	 */
    	public Boolean delUser(User u){
    		return userDao.delUser(u);
    	} 
    
    
    }
    
    
    

    UserDao.java的代码为

    package com.hyg.dao;
    
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    import com.hyg.model.User;
    
    public class UserDao extends BaseDao {
    	
    	/**
    	 * 
    	 * @param userno 账号
    	 * @param pwd 密码
    	 * @return true 登录成功 false 登录失败
    	 */
    
    	public User login(String userno, String pwd) {
    		String sql="select * from k_user where userno='"+userno+"'and pwd='"+pwd+"'";
    		try {
    			this.conn=this.getConn();
    			//获得数据库链接
    			this.ps=conn.prepareStatement(sql);
    			//获得命令执行对象
    			this.rs=ps.executeQuery();
    			//执行命令,查询命令
    			if(rs.next()){
    				String username=rs.getString("username");
    				String position=rs.getString("position");
    				int age=rs.getInt("age");
    				int id=rs.getInt("id");
    				
    				User user=new User();
    				user.setId(id);
    				user.setUsername(username);
    				user.setUserno(userno);
    				user.setPwd(pwd);
    				user.setPosition(position);
    				user.setAge(age);
    				
    				return user;
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    	public List<User> findUserList() {
    		// 查询用户列表,返回用户集合
    
    		String sql="select * from k_user";
    		try {
    			this.conn=this.getConn();
    			//获得数据库链接
    			this.ps=conn.prepareStatement(sql);
    			//获得命令执行对象
    			this.rs=ps.executeQuery();
    			//执行命令,查询命令
    			List<User> list=new ArrayList<User>();
    			while(rs.next()){
    				String username=rs.getString("username");
    				String position=rs.getString("position");
    				int age=rs.getInt("age");
    				int id=rs.getInt("id");
    				String userno=rs.getString("userno");
    				String pwd=rs.getString("pwd");
    				
    				User user=new User();
    				user.setId(id);
    				user.setUsername(username);
    				user.setUserno(userno);
    				user.setPwd(pwd);
    				user.setPosition(position);
    				user.setAge(age);
    				
    				list.add(user);	
    			}
    			return list;
    			
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    	/**
    	 * 添加用户
    	 * @param u 用户对象
    	 * @return true添加成功 false 添加失败
    	 */
    	public Boolean addUser(User u){
    
    		String sql="insert into k_user(userno,pwd) values('"+u.getUserno()+"','"+u.getPwd()+"')";
    		try {
    			this.conn=this.getConn();
    			//获得数据库链接
    			this.ps=conn.prepareStatement(sql);
    			//获得命令执行对象
    			int result=ps.executeUpdate();//返回受影响的行数
    			if(result>0){
    				//执行成功
    				return true;
    			}
    			//执行更新命令(添加、修改、删除)
    			} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return false;
    	}
    	/**
    	 * 修改员工职位
    	 * @param 
    	 * @return true 修改成功  false 修改失败
    	 */
    	public Boolean updateUser(User u){
    		String sql="UPDATE k_user set POSITION='"+u.getPosition()+"'WHERE id="+u.getId()+" and pwd='"+u.getPwd()+"'";
    		try { 
    			this.conn=this.getConn();
    			//获得数据库链接
    			this.ps=conn.prepareStatement(sql);
    			//获得命令执行对象
    			int result=ps.executeUpdate();//返回受影响的行数
    			if(result>0){
    				//执行成功
    				return true;
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return false;
    	}
    	public Boolean delUser(User u){
    		String sql="DELETE from k_user where id=" + u.getId()+" ";
    		try { 
    			this.conn=this.getConn();
    			//获得数据库链接
    			this.ps=conn.prepareStatement(sql);
    			//获得命令执行对象
    			int result=ps.executeUpdate();//返回受影响的行数
    			if(result>0){
    				//执行成功
    				return true;
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return false;
    	} 
    	
    	
    
    }
    
    

    BaseDao.java的代码为

    package com.hyg.dao;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    
    /**
     * 
     * 数据库访问基类
     *
     */
    public class BaseDao {
    //数据库驱动
    	private String driver="com.mysql.jdbc.Driver";
    	//数据库地址
    	private String url="jdbc:mysql://localhost:3306/orcl?useUnicode=true&characterEncoding=UTF-8";
    	//数据库连接的账号
    	private String name="root";
    	//数据库连接的密码
    	private String pass="root";
    	
    	
    	Connection conn;//数据库链接
    	PreparedStatement ps;//执行命令SQL
    	ResultSet rs;//存储执行结果
    	
    	/**
    	 * 获得数据库链接的对象
    	 * @return 数据链接对象
    	 */
    	
    	public Connection getConn(){
    		try {
    			Class.forName(driver);
    			Connection conn=DriverManager.getConnection(url,name,pass);
    			return conn;
    		} catch (Exception e) {
    			//写入日志文件
    			//向控制台打印异常
    			e.printStackTrace();
    		}
    		return null;
    	}
    	public static void main(String[] args) {
    		new BaseDao().getConn();
    	}
    	
    }
    

    User.java的代码为

    package com.hyg.model;
    /**
     * 
     * 用户实体类(数据的载体,承载数据用)
     *
     */
    public class User {
    
    	private int id;//id
    	private String username;//姓名
    	private String userno;//账号
    	private String pwd;//密码
    	private String position;//职位
    	private int age;//年龄
    	
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getUsername() {
    		return username;
    	}
    	public void setUsername(String username) {
    		this.username = username;
    	}
    	public String getUserno() {
    		return userno;
    	}
    	public void setUserno(String userno) {
    		this.userno = userno;
    	}
    	public String getPwd() {
    		return pwd;
    	}
    	public void setPwd(String pwd) {
    		//
    		this.pwd = pwd;
    	}
    	public String getPosition() {
    		return position;
    	}
    	public void setPosition(String position) {
    		this.position = position;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	
    }
    
    
    展开全文
  • 最近碰到一个需求,要对数据库查出来的东西进行排序,但是很坑的是数据库存的是字符串类型,所以不能用order by,所以我就毫无办法。当然不对,这怎么可能难得到我呢 ...
  • // 将数据放入map类型的集合中 List> dataList = new ArrayList>(); String[] assetHeadTemp = { "商品名称", "销量", "库存", "周转率", "图片" }; String[] assetNameTemp = { "maktx", "saleCount", ...
  • // 数字字段需要按照数值类型排序,而不是字符串类型排序。需覆盖DefaultTableModel的getColumnClass方法进行数值排序 model = new DefaultTableModel(result, COLUMN) { public Class getColumnClass(int ...
  • 2017-11-12 博客Spring Boot系列九 spring mvc的@RequestMapping支持的方法参数类型和返回类型 对应的git代码为tagv0.4 2017-11-06 博客Spring Boot系列八 spring boot集成jsp、restful接口、springmvc基本功能对应...
  • Springboots + Redis

    2020-03-26 15:36:24
    Redis的键值类型有:String字符类型、map散列类型list列表类型、set集合类型、sortedset有序集合类型。 Redis适用场景:秒杀库存核减,常用访问数据量高的相对固定数据,分布式集群架构中的session...
  • 字符串类型--string redis的字符串是二进制安全的,什么是二进制安全?简单理解就是存入什么数据取出的还是什么数据...列表类型list)可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表
  • * 一般物料数据物料订单数据物料成本计算数据物料仓库数据是必须输入 一般物料数据 物料代码与名称物料类型生产品采购品一般物料成本物料服务物料外包物料LIST物料指定是否管理物料组物料的分类统计设定库存评价时...
  • Python基础(3)

    2019-09-30 18:28:56
    #导入第三方库时,自动在里进行查找#默认第三方库存放在site-packags中#Python解释性语言#数据类型初识#1.数字#2.type()查看数据数据类型#bool类型 1表示True 0 表示 False#三元运算#例子: result= 值1 if 条件...
  • redis面试全面总结

    2019-11-25 17:48:08
    一、常见应用场景 ...Redis支持的数据类型要丰富得多,Redis不仅仅支持简单的k/v类型数据,同时还提供String,List,Set,Hash,Sorted Set,pub/sub,Transactions数据结构的存储。其中Set是HashMap...
  • 商城秒杀功能实现

    2020-01-02 10:15:30
    令牌机制实现秒杀功能 利用定时任务(或数据库...(采用List数据类型存储的原因主要是每一个线程从List中pop时是单线程处理的,所以每一个线程拿到的令牌就不可能是同一个了) 2.内存缓存需要加上lock保证读取的个...
  • Redis命令

    2019-10-05 20:20:04
    我用过的Redis存数据基本都是存String和list类型,对象全都序列化,存String类型。现在回想起来真是简单粗暴。有2个实际业务,数据库存着一些结构化图片,有以下的结构,比如天气是晴天的图片,天气是雨天的图片,...
  • redis面试题

    2020-06-11 10:04:28
    1、redis五大数据类型 String:字符串,二进制安全,最大支持512m ​ setnx k v : 设置键值对当键不存在时 ​ setex k seconds v : 设置键值对同时设置过期时间 ​ 使用最多的数据类型就是String类型 ​ 场景: ...
  • Redis是一个分布式key-value缓存系统,value支持多种数据结构,这里value可以选择两种类型,String(或者hash):主要用于记录商品的库存,对商品减库存。Set集合(这里不要用list集合,list集合...
  • Redis 应用:缓存

    2018-02-28 15:09:00
    使用Redis做预定库存缓存功能 缓存是在业务层做的,准确讲应该是在MVC模型中Model的ORM里面 PHP项目的缓存从以前的APC缓存逐渐切换到Redis中,并且...Redis支持5种存储类型:String,Hash,List,Set,Sort...
  • 此处用到了redis中的链表(list)(list是redis数据类型) 这里先介绍栈与队列。 栈:从链表的头部添加元素,先进后出。 队列:从链表的尾部添加元素,先进先出。 第一步:先将商品库存存入队列 <?php ...
  • Redis知识点总结

    2021-02-21 17:39:42
    存储数据类型: String 、Hash 、List 、 Set 、Zset 使用场景: 取TopN的操作 例如 热搜榜 设置过期时间的应用 例如 短信验证码 计数器 例如 电商网站保存库存 Uniq的相关操作 统计网络的独立访客 保存垃圾网站网址 ...
  • Redis基础的问与答

    2021-01-07 07:28:22
    常用的五种基本数据类型:String(字符串)、Hash(字典)、List(列表)、Set(集合)、Zset(SortedSet:有序集合) String类型 string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一...
  • php和redis的交互

    2017-11-02 09:31:23
    博客原文地址... 在thinkphp5.0框架使用redis,redis支持五种数据类型 string hash list set zset namespaceapp\index\controller; usethink\db; classIndex { /** *模拟商品的总库存
  • 【Redis篇】Redis基础

    2020-07-13 18:07:26
    为什么要用Redis 因为传统的关系型数据库如Mysql已经不能适用所有的场景,比如秒杀的库存...5个基本数据类型 String、Hash、List、Set、SortedSet。 中高级用户 HyperLogLog、Geo、Pub/Sub。 加分 Redis Module,像Blo
  • Redis:总结

    2020-08-06 16:25:56
    常用数据类型及应用场景: String:字符串 内部编码: int:8个字节的长整型 embstr:<=44字节的字符串 raw:>44字节的字符串 场景: 缓存功能 计数器 共享用户Session Hash 内部编码: 外层是hashtable 内层...
  • PS ::: realCost 和 realArea都是varchar类型 ,并且数据库存的都是80.0 65.0之类的数据 在mysql执行没有问题 在hibernate中 String hql = "select p from ...
  • 实例059 使用数据采集器实现库存盘点 2.5 绚丽网站:jQuery视图开发 实例060 结合jQuery实现文件上传 实例061 结合jQuery实现在线裁剪 实例062 图片幻灯片 实例063 密码强度检测 实例064 颜色拾取器 实例065...

空空如也

空空如也

1 2 3
收藏数 56
精华内容 22
关键字:

数据库存list类型